2015-10-13 100 views
0

我正在尝试使用套接字编程。我构建了一个简单的echo服务器,它在屏幕上打印客户端文本,并向客户端发回一条感谢消息。然而,当我运行客户端(它在循环中单独产生10000个请求)时,有时我会在某些客户端线程中出现“连接被拒绝”异常。有时候一切都没有例外。可用的最大插座连接数

以下是我的服务器代码:

public class WebServer { 
    static int hitCount = 0; 

    public static void main(String[] args) throws Exception { 
     ServerSocket serverSocket = new ServerSocket(7777, 10000); 
     while (true) { 
      Socket defaultSocket = serverSocket.accept(); 
      new Thread(new ServerSlave(defaultSocket)).start(); 
      System.out.println("Size is :" + hitCount); 
     } 

    } 
} 

class ServerSlave implements Runnable { 
    Socket clientSocket; 

    public ServerSlave(Socket socket) { 
     clientSocket = socket; 
     WebServer.hitCount++; 
    } 

    public void run() { 

     try { 

      DataInputStream inputStream = new DataInputStream(clientSocket.getInputStream()); 
      DataOutputStream outputStream = new DataOutputStream(clientSocket.getOutputStream()); 
      System.out.println(inputStream.readUTF()); 
      outputStream.writeUTF("Thank you for contacting the web server"); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       clientSocket.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

以下是我的客户端代码:

public class Client { 
    static int excepCount=0; 
    public static void main(String[] args) throws Exception { 
     for (int i = 0; i < 10000; i++) { 
      new Thread(new Worker("" + i)).start(); 
     } 
     Thread.sleep(10000); 
     System.out.println(Client.excepCount); 
    } 
} 


class Worker implements Runnable { 
    String clientName; 

    public Worker(String name) { 
     clientName = name; 
    } 

    public void run() { 
     System.out.println("Process started for : " + clientName); 
     Socket socket = null; 
     try { 
      socket = new Socket("127.0.0.1", 7777); 
      DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream()); 
      outputStream.writeUTF("Hello socket. Client number " + clientName + "here"); 
      InputStream inFromServer = socket.getInputStream(); 
      DataInputStream in = 
        new DataInputStream(inFromServer); 
      System.out.println("Server says " + in.readUTF()); 
      System.out.println("Closing socket"); 

     } catch (IOException e) { 
      Client.excepCount++; 
      e.printStackTrace(); 
     }finally{ 
      try { 
       socket.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

不知道我可能是做错了。有什么建议么 ?

回答

2

你期待太多。客户以最大速度形成10,000个连接是不现实的。你忘记了TIME_WAIT状态,并且只有64k减去几十个客户端端口。这不是一个现实的测试。如果你想加载测试你的服务器,你将需要不少客户端主机,或者连接间隔较长。

+0

我是这么想的。但是,如果10000台不同的客户端主机同时连接到服务器,会发生同样的情况吗?因为在端口80上侦听的网络服务器有很多连接。例如热门网站等。你能否详细说明TIME_WAIT? – Rishi

+0

当然,它可能。完全取决于您的服务器可以接受连接的速度。 – EJP