2012-05-11 93 views
0

我試圖建立一個套接字服務器在PHP中,但發現,因爲缺乏多線程能力在PHP中,如果服務器加載連接(可以說,即使是少量的300連接),服務器將會非常慢。Java套接字服務器保持活着執行

我已經切換到java,並構建了一個多線程套接字服務器,並試圖在10秒內用100個連接重載它,我必須說它勇敢地承擔了..我自己的電腦(這使得過載)成爲在這個過程中真正的緩慢,但服務器看起來像他沒事。

因爲我建立一個服務器應該同時運行大量的連接,我試圖使高效率,而不是讓任何鬼連接打開。

那裏因爲我正在執行「Keep Alive」方法,我的問題如下: 如果我在服務器中打開了600個打開的連接,並且顯然需要服務器在所有線程之間運行以檢查keep活着,甚至是從客戶那裏得到保持活着的消息 - 應該檢查是否發送了保持活動消息的適當時間。 我想過2分鐘左右 - 所以服務器要忙,另一方面我不希望我的客戶經常發送數據。 有什麼建議嗎?

+0

你對每個插槽的每個線程使用阻塞套接字嗎?我建議您切換到java.nio,因爲您可以避免使用單個線程爲您完成這項工作,並且可以大大提高應用程序的性能。 – Buchi

+0

你的意思是在我的服務器端?你能給我更多的信息嗎?現在我在我的主函數接受一個套接字並啓動一個新的線程來處理它 –

+0

我讀過關於SocketChannel對象和ServerSocketChannel對象。 如果我理解正確,它具有更好的性能,因爲新線程只在有新任務要執行的地方打開(讀取,寫入等),所以基本上大部分時間少的線程會同時運行,而不是在我的代碼中運行連接有一個線程,不管它是否有任務去執行或者不是。這是正確的嗎? –

回答

0

600個開放連接。假設保持活動狀態每2分鐘發送120秒,這意味着每秒有5個線程準備好發送保持活動狀態。假設所有連接都處於啓動狀態,五個線程將很快準備好處理來自對等體的回聲。所以,大約需要運行10個線程/秒來支持保持活動。

這是一個微不足道的加載。

如果客戶端很忙,那麼這些客戶端將不會被髮送保持活動狀態,因此當客戶端變得非常忙時,保持活動的負載會下降。

你聽起來像你應該沒問題。

+0

由於移動應用程序的原因,我想從客戶端發送保持活動狀態,並且客戶端有更多的機會斷開與服務器的連接,然後再次反覆。 每一個線程,當它沒有新的時候,檢查自從最後一個keepalive以來有多久,如果它超過它斷開客戶端並完成線程的時間(並且通過清理新客戶端的內存和帶寬) –

相關問題