2012-12-27 31 views
2

我正在進行一項實驗,以查看java在TCP中需要多長時間。首先我啓動服務器。然後多次調用函數client_tcp,超過50000次。並測量連接所需的時間,併發送和接收1個字節。當服務器獲得多於16384個請求(有時會有所不同)時,客戶端無法連接到服務器。Java TCP服務器在接收到16384個字節後不接受客戶端請求MAC OS

我不知道是否因爲服務器套接字中的接收緩衝區大小。就我而言,ss.getReceiveBufferSize()= 131072

下面是代碼:

public synchronized void server_tcp(int port) { 
    ServerSocket ss; 
    Socket  so; 
    InputStream is; 
    OutputStream os; 

    try {   
     ss = new ServerSocket(port); 
    } catch (Exception e) { 
     System.out.println("Unable to connect to port " + port + 
       " TCP socket."); 
     return; 
    } 

    while (true) { 
     try { 
      so = ss.accept(); 
      is = so.getInputStream(); 
      os = so.getOutputStream(); 
      int ch = is.read(); 
      os.write(65); 
      so.close(); 
     } catch (IOException e) { 
      System.out.println("Something went wrong."); 
     } catch (InterruptedException e) { 
      System.out.println("Bye."); 
     } 
    } 
} 

public void client_tcp(String host, int port) { 

    Socket  so = null; 
    InputStream is = null; 
    OutputStream os = null; 

    try { 
     so = new Socket(host, port); 
    } catch (UnknownHostException e) { 
     System.err.println("Error Host not found."); 
     return; 
    } catch (IOException e) { 
     Syste.err.println("Error Creating socket."); 
     return; 
    } 

    try { 
     os = so.getOutputStream(); 
     is = so.getInputStream(); 

     os.write(65); 

     is.read(); 

     os.close(); 
     is.close(); 
     so.close(); 
    } catch (IOException e) { 
     System.err.println("Error."); 
     return; 
    } 
} 

有什麼不對?

謝謝。

+0

嘗試從控制檯窗口運行「netstat -a」,系統釋放關閉的套接字需要時間。當你從本地機器連接到本地機器時,你將佔用兩個插槽,機器至多有64k,其中很大一部分將被其他程序使用。 – BevynQ

+0

它將是一個低級別的東西(JVM,本地代碼),在代碼中不是問題,也不是buff大小:您不會將讀取值存儲到buff中。 – 2012-12-27 01:34:50

+0

你的測試沒有意義。沒有一個合理的寫客戶端會發送和接收一個字節,然後關閉連接。嘗試測試和衡量真正發生的事情。 @BevynQ你正在混淆帶有端口的套接字。 – EJP

回答

0

您正在創建大量的套接字幾乎一次,操作系統沒有足夠的時間釋放它們。您可以在調用client_tcp()方法的循環中添加一個微小的延遲(將通過實驗調整)。

for(int i=0; i<50000; i++) { 
    new SocketReuse().client_tcp("127.0.0.1", 4444); 
    Thread.sleep(2); // 2 milliseconds delay 
} 
+0

我試過了,它工作正常。非常感謝你。 – escrichov

相關問題