2013-04-21 102 views
0

ServerSocket与多个客户端一起使用我们为每个客户端附加单独的线程来工作可能,但问题是连接工作正常,并接受所有客户端,但只服务于最后一次连接。所以不是问题或者这是正常的。ServerSocket与多个客户端

服务器代码:

ServerSocket serverSocket=null; 
    Socket client; 
     System.out.println("Establishing Connection. Please wait..."); 
    try{ 

      serverSocket =new ServerSocket(58342);    
      System.out.println("Serever Started."); 
     }catch(Exception e) 
     { 
      System.out.println(e.getMessage()); 
     } 

     while (true) { 
       try{ 
      client = serverSocket.accept(); 
        new ClientThread(client).start(); 
       }catch(Exception e) 
       { 
        String err=e.getMessage(); 
        if(err == null) 
        { 
         break; 
        }else{ 
         System.out.println(e.getMessage()); 
        } 
       } 

     } 

ClientThread

public class ClientThread extends Thread{ 

    private static Socket client; 
    private static String line=""; 
    private static DataInputStream input = null; 
    private static DataOutputStream output = null; 

    public ClientThread(Socket serv) 
    { 
     try { 
      client =serv; 
      input=new DataInputStream(client.getInputStream()); 
      output=new DataOutputStream(client.getOutputStream()); 
      System.out.println("New Client Connected to port:"+ 
        client.getPort()); 
      } catch (Exception e) { 
        System.out.println(e.getMessage()); 
      }  
    } 
} 

回答

4

您的ClientThread中的所有变量都是static

这意味着它们是在所有ClientThread的实例中共享。因此,每次创建new ClientThread时都会覆盖它们。

删除static,你应该没问题。

在我看来,你可能需要阅读一些documentation

+0

是的你是对的。我忘记了我在同一个ID内工作,非常感谢。如果你没有回答我不会得到它。因为我不会感谢它 – Alyafey 2013-04-21 23:33:22

0

您必须ClientThread的构造做I/O。

不要。

+0

是的,我看过编辑答案 – Alyafey 2013-04-21 23:09:28

+0

当其运行方法完成时,您没有关闭客户端套接字。添加一个可以做到这一点的finally块。 – EJP 2013-04-21 23:18:50

+0

我做到了,但没有任何帮助 – Alyafey 2013-04-21 23:23:53