2014-06-27 38 views
2

我正在嘗試構建一個套接字,該套接字能夠在具有多個客戶端的不同端口上同時進行多個TCP連接。Java TCP服務器套接字接受不同端口上的多個客戶端

這種情況是我的套接字必須從服務器接收命令並將命令重定向到無線傳感器(一個命令傳輸到一個傳感器,而不是廣播),並能夠從傳感器收集相應的數據,然後將它們發回到服務器。與服務器的連接將使用TCP,但與傳感器的連接可能是TCP或UDP。 我主要關心的是TCP連接。我正在研究java多線程或線程池集套接字教程。但我見過的例子只使用一個端口來處理所有的連接。我也試圖尋找到其他可能的解決方案:利用tomcat服務器,Java servlet/JSP,套接字通道等...

我不是網絡或套接字編程的專家,所以我真的希望有經驗的人可以指出我在正確的方向。感謝您在這種情況下提供的任何幫助。

不知道我是否完全理解,但似乎沒有必要爲我的情況獲取多個端口。似乎我需要關注多線程套接字和Java NIO主題?

再次感謝您的建議和幫助。

回答

0

除非您要超過10k連接,否則大多數Web服務器將能夠處理流量。

但是,也許你應該獲得有關連接,套接字和端口之間差異的更多細節。看看這個:What is the difference between a port and a socket?

在你的問題:一個端口可以處理很多連接。您不需要不同的端口用於不同的連接。

+0

感謝您的定義。我可能應該繼續嘗試使用單個端口。 – Teddy

-2

爲什麼要使用多個端口?您可以在一個偵聽端口上有多個連接。連接itselve總是在不同的端口上運行。

while (running) 
{ 
    try 
    { 
     @SuppressWarnings("resource") 
     Socket socket = serverSocket.accept(); 
     new ServerHandler(socket); // ServerHandler is your class to handle one connection. 
    } 
    catch (IOException e) 
    { 
     ... 
    } 
} 

當你真的需要不同的端口時,你可以創建大量的線程,每個線程都有一個ServerSocket。在您的計算機上放置最有限的資源之一。正在運行的線程非常幼稚。

forr(int i = 1000; i < 1100; i++) 
{ 
    final int port = i; 
    new Thread(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      try 
      { 
       ServerSocket serverSocket = new ServerSocket(port); 
       Socket socket = serverSocket.accept(); 
       new ServerHandler(socket); // ServerHandler is your class to handle one connection. 
      } 
      catch(IOException e) 
      { 
       ... 
      } 
     } 
    }).start(); 
} 
+0

不要使用不同的線程 - 這是相當內存密集型。使用Java的NIO(新的IO ..雖然這不再是新的)! – ErstwhileIII

+1

「連接本身」並不總是在不同的端口上運行。 – EJP

3

這是一個相當大的項目,在這裏完整地回答。但這裏有一些一般的指南:

1)如果你想在一個端口上創建一個套接字,你需要創建一個線程來運行它。這被稱爲服務器套接字。因此,在主線程中,您需要爲每個端口上的每個套接字調用一個線程。

2)每個服務器套接字不斷監聽某個端口並等待客戶端連接。 當客戶端實際連接時,服務器套接字應單獨爲該連接打開另一個線程並返回到偵聽。

而(myServerSocket.accept()){ 開放 連接螺紋 }

我的建議是在網上了解如何打開從班線,然後按照上面的指南。