我有一個應用程序,我必須在兩個實體之間發送信號和數據。 哪種方式是最佳實踐,爲什麼?有效使用Java中的套接字
- 打開4個插座,2爲在兩個方向上的信號和圖2爲數據在兩個方向上
- 打開2個插槽各自用於數據和信號
- 只需打開1個插座和濾波器信號和數據
我有一個應用程序,我必須在兩個實體之間發送信號和數據。 哪種方式是最佳實踐,爲什麼?有效使用Java中的套接字
首先,套接字是全雙工的,也就是說,您不需要單獨的套接字(連接)來發送和接收數據。
其次,很難說,沒有進入更多的細節。然而,瞭解HTTP的歷史(命令/標題和數據的一個連接)和FTP(單獨的命令和數據連接)看起來像HTTP設計者是一個更好的選擇。兩個連接是更多的代碼維護,一些防火牆不喜歡掛起,空閒的FTP命令連接時,大部分數據傳輸。
所以,去一個連接,很容易信號和數據(標誌,標題等)之間進行區分另外傳入和傳出的信道是完全正交。
爲什麼你不能只有1個插座的所有數據和1個插座的所有信號。您可以在從同一套接口讀取來自遠程實體的信號的同時,向遠程實體發送信號。這就好像FTP(非被動)如何工作,你有一個控制連接,然後用於實際的數據傳輸。
擁有4個插槽,似乎矯枉過正,但我不知道什麼樣的信號或數據的上下文。
如果你不介意多碼解碼網絡通信,你絕對可以做到這一切在一個插座。它需要更多的思考進入實際的溝通,如果你願意的話,更好的「協議」。 2插座和1插座型號都很好。
有一個可能的「中間道路」 - 使用JBoss遠程或類似的複用在一個真正的頂部幾個虛擬插座。這樣,您可以在應用程序級別保持數據和控制通道的獨立性,但在操作系統級別仍然只需要一個TCP端口(因此最多隻有一個防火牆漏洞)。
另一種方法:使用專門爲realtime application like 0MQ構建的中間件。
要實例ØMQ:
Jzmq obj = new Jzmq (hostname);
其中hostname是zmq_server運行框中的名稱或IP地址。
要創建接線,可以使用createExchange,createQueue和bind函數。有關接線機制如何工作的詳細描述請看這裏。
int eid = obj.createExchange ("E", Jzmq.SCOPE_GLOBAL, "10.0.0.1:5555");
obj.createQueue ("Q", Jzmq.SCOPE_GLOBAL, "10.0.0.1:5556");
obj.bind ("E", "Q");
發送消息非常簡單。消息在字節數組的形式提供:
byte msg [] = {1, 2, 3, 4, 5, 6};
obj.send (eid, msg);
接收消息是更簡單:
byte [] msg = obj.receive();
全部樣品available here。
感謝您的回答,HTTP/FTP推理很有意義。 –