在我創建的應用程序中,服務器接受來自客戶端的套接字連接並執行各種工作。客戶列表存儲在clients
中,其類型爲LinkedList
。如何在代碼持有接受新插座時檢查某個變量?
,同時基於該clients
隊列的大小與條件語句聲明我使用。
我想知道是否有解決以下的問題的方式......使服務器永遠不會掛起。
while(clients.size()>0){ //few clients the queue is alive at the moment
//Suddenly, all clients in the queue shut down at this point in the while loop,
//Another thread, which checks clients knows that clients are dead
//so clients.size() becomes 0, but there is no way to check that at this point
//and server is expecting for connection clients forever
Socket socket= server.accept();
socket.close();
}
//printout results
編輯
客戶端列表不只是現有的客戶。這是一個活着的客戶列表。此列表由另一個線程更新。
我有上面的陳述,因爲我想在沒有活着的客戶端之後做一些工作。 (無論是完成了他們的工作,或者剛剛死去)
我不想使用超時異常來解決這個問題,因爲客戶端將響應在隨機時間。 (再次,客戶的活躍度是通過與心跳技術另一個線程檢查)
爲什麼你想要一個不使用超時的解決方案?使用'SocketTimeoutException'沒有任何問題。你可以在循環中捕捉它,並適當地處理它(請參閱我的答案爲例)。如果您願意,您還可以爲不同的套接字設置不同的超時時間。 –
因爲...客戶端必須響應服務器,結果他們已經處理。根據提供給客戶的參數,這可能需要1秒或1分鐘。這就是爲什麼我正在用活着的客戶端管理客戶端隊列。該列表由另一個線程更新。 – user482594
是的,但您可以在循環內等待*下一個連接*。超時並不意味着你放棄了下一個客戶,它只是讓你有機會檢查你是否還應該等待。無限期地等待幾乎總是一個壞主意。如果客戶發生故障,或者在響應之前斷電,會發生什麼?如果你有網絡問題怎麼辦?如果你正在編寫一個強大的系統,你需要**來處理這些情況。基本上,如果你*沒有超時,那麼你對'socket.accept'的調用將永遠等待。這真的是你想要的嗎? –