public void run(){ 
        try { 
            while(true){ 
                Socket socket = null; 
                socket = serverSocket.accept(); 
if(userhashtable.get(username)){       //如果线程已开启,即将新的SOCKET覆盖旧的SOCKET
userThread.setSocket(socket);
}else{
                UserThread userThread = new UserThread(socket);
                 userThread.start(); 
userhashtable.put(username,userThread);//将成功登陆的用户保存在列表上
}
            } 
        } catch (Exception ex) { 
            ex.printStackTrace(); 
        } 
    }
    第一次登陆成功后,数据是可以正常输入输出通讯,但现在问题是,如果USER重新登陆后,盖旧的SOCKET后,数据就无法在服务器端发送到
客户端.
    应该如何做呢,KILL了原来的线程,关闭原来的SOCKET,再开线程,,,都试过了,都不行!请路过的大侠帮忙看看!    是不是原来的SOCKET没有处理好呢?应该如何去做????? 谢谢!
    

解决方案 »

  1.   

    测试一下,每次更新了userhashtable,都遍历一下,看里面都有那些用户,
    你确定更新成功了吗?
      

  2.   

    Hashtable直接PUT进去就可以了!遍历一下好象没有必要!
    猜想可能是SOCKET里的TIMEOUT,一直在没异常,所以...不知道为何不可以确确地关闭SOCKET和线程,  再重新开启
      

  3.   

    user可以重复登录吗?
    TCP连接客户端退出后,相应的线程要退出
    user再次登录时应该起新的线程
      

  4.   

                             if( GkbMobileServer.cleintSocketTable.containsKey( machineName ) ){
                                 Dates atime  = new Dates();
                                 GkbClientServiceThread gkbcs = (GkbClientServiceThread)GkbMobileServer.cleintSocketTable.get(machineName);
                                 gkbcs.offSocket();
                                 gkbcs.setDoneFlag(true);
                                 GkbClientServiceThread cst = new GkbClientServiceThread( machineName ,clientSocket,printer );
                                 pool.execute(cst);
                                 if( printer )
                                    System.out.println( machineName + " --> a-conn to Server.");
                                 GkbMobileServer.cleintSocketTable.put( machineName , cst );
                              }else{
                                 GkbClientServiceThread cst = new GkbClientServiceThread( machineName ,clientSocket,printer );
                                 pool.execute(cst);
                                 if( printer )
                                    System.out.println( machineName + " -->conn to Server.");
                                 GkbMobileServer.cleintSocketTable.put( machineName , cst );
                                 //cst.start();
                              }以上是完全的登陆和再次登陆的代码!
      

  5.   

    我现在的SERVERSOCKET才并发一百多台硬件的客户端!  到底JAVA的SERVERSOCKET可以支持多少!我是用阻塞方式做的.
    做过的朋友,说说能带多少客户端.
    我现在的问题也是重新开线程的做的,不知道现在的做法是否适合.
      

  6.   

    SERVERSOCKET阻塞方式可以带多少客户端呢?