2015-01-03 51 views
0

我正在用Java創建一個聊天應用程序。我毫不費力地讓服務器接受多個客戶端套接字連接並維護多個線程。我已經設法讓他們發送和接收消息。在Java中,如何創建到同一特定客戶端的多個套接字連接?

然而,我無法弄清楚如何創建多個套接字連接到同一個特定的客戶端。在服務器和客戶端上,我都有一個用於發送和接收聊天消息的線程。我希望有另外一個連接來做後臺工作,比如發送文件,同時繼續傳遞聊天消息。

例如,客戶端1和客戶端2通過服務器,這使帳戶數據庫和聊天消息短信彼此。我希望能夠從Client1發送文件到Client2,反之亦然。

Connection1: Client1 <--message--> Server <--message--> Client2 
Connection2: Client1 --file--> Server --file--> Client2 
or 
Connection2: Client1 --file--> Client2 

我在想如何爲每個客戶端有IP地址,我可以使用它們來創建新的連接。但是,由於我在本地主機上運行這個,所有的IP地址都是相同的,所以我不能這樣做。

+1

使用TCP端口? – xTrollxDudex

+0

IRC很久以前就解決了這個問題。看看[DCC](http://en.wikipedia.org/wiki/Direct_Client-to-Client)如何處理它。 (這不是所有的NAT友好的,但你不會發現很多,除非服務器最終涉及每個字節傳輸。) – cHao

+0

客戶端連接到服務器,而不是相反。 – EJP

回答

0

在服務器端:使用兩個不同的端口打開兩個ServerSockets。

在客戶端:連接到聊天服務器打開兩個客戶接一個,另一個你的文件服務器。

但是,我不知道你是否在同一個網卡上用兩個連接贏得了一些東西。我建議你在接收到命令時(聊天或其他消息)區分命令並使用兩個不同的隊列(或者使用一個隊列併爲您的任務設置層次結構)爲它們提供服務。您也可以使用ThreadPool來執行您的任務。在任何情況下,您都可以使用非阻塞I/O(NIO),看看NettyJetty項目支持它。

現在Connection2: Client1 --file--> Client2

使用P2P客戶端之間將改善性能和服務器的網絡資源,但當然你失去匿名性和它要複雜得多。假設聊天對話只在兩個用戶之間進行(維持一個N-N P2P聊天是一項更爲複雜的任務),您可以爲客戶端設備提供ServerSocket支持,並始終使其中一個用作服務器,另一個用作客戶端。

事實上,你可以使用現有的ServerSocket只同步用戶(使用某些命令爲),並指導用戶。只能將此套接字用作用戶匹配的服務器。當您需要在兩個用戶之間發起聊天時,請求其中一個運行ServerSocket,另一個運行客戶端套接字。通知他們彼此的IP,並讓他們之間進行連接。你的服務器現在只是一箇中介,只發起連接。

*如果你運行一個P2P解決方案,爲什麼不聊天+文件服務使用這個? (如果你不需要記錄消息,你可以這樣做,這樣你的服務器只能做裁判)。

**關於端口號用於P2P,您可能需要設置NAT規則到路由器。

相關問題