2013-07-17 34 views
4

我還沒有找到明確的答案在這一個。套接字編程的最佳實踐是什麼 - 每次都關閉還是保持打開狀態?

我在Java 7中有一個客戶端/服務器應用程序。服務器和客戶端在單獨的計算機上。客戶端有一個短的(1行10個字符)命令發佈到服務器,服務器響應(120個字符的字符串)。這將每隔X秒重複一次 - 其中X是配置文件中的速率。這可能短至1秒到Integer.MAX_VALUE秒。每當我創建客戶端/服務器應用程序時,哲學就創建了連接,完成業務,關閉連接,然後對數據執行其他任何操作。這似乎是事情應該完成的方式 - 特別是在使用資源編程嘗試時。

什麼是打開一個套接字連接掛在那裏X秒的打嗝?關閉並重新啓動是否是一個最佳實踐,或者對於套接字保持連接並且每隔X秒發送一次命令更好一些?

+1

如果您未使用非阻塞IO,則打開套接字連接通常意味着每個客戶端連接都會在服務器的線程池中佔用一個線程。如果您可以使用非阻塞IO,則將連接打開將更有效。如果你發現它死了,重新建立它。 –

+0

打開一個插座被認爲是一個「昂貴的」操作 – RCB

+0

因此,這是一個昂貴的操作與線程閒置的平衡嗎? – user2363027

回答

0

恕我直言,客戶應該打開,做它的事情,然後關閉。

在服務器上... 在UNIX中,通常會分叉一個進程來接聽呼叫(每個呼叫);但是,在Windows上,通常會爲每個入站呼叫創建一個新線程。

+0

後者在UNIX和Windows上可能更常見於JAVA。 – tallen

3

我認爲答案取決於您期望擁有的客戶數量。

如果你永遠不會有很多的客戶端連接打開,那麼我會說打開連接並稱之爲好,特別是如果延遲是一個問題 - 即使在局域網上,我已經看到連接需要幾毫秒來初始化。但是,如果您希望成千上萬的客戶端連接並執行此操作,則每次都會重新連接。正如其他人所說的,將非阻塞套接字保持打開狀態通常意味着您的線程仍在運行,這可能會在每個線程上佔用幾兆字節的堆棧空間。這樣做幾千次,在大多數機器上你會遇到大問題。

另一個問題是端口空間。僅僅因爲TCP/IP堆棧給我們提供了65535個端口並不意味着所有的端口都可用 - 事實上,大多數本地防火牆將禁止大多數端口被使用,所以即使你有足夠的內存來運行數千個併發線程,你也可以如果您同時打開很多連接,可能會用盡端口。

+0

1.打開插座並不意味着專用線程。 2.線程通常不會有「幾兆字節的堆棧」。通常爲1mb,可以配置爲幾十千字節(這對於無遞歸代碼來說是絕對正確的) – Grigory

相關問題