3
我在Ruby中實現了一個小型客戶端服務器應用程序,並且存在以下問題:服務器爲每個連接的客戶端在新線程中啓動新的客戶端會話,但應該可以關閉服務器,並停止所有的客戶端會話從外面'禮貌'的方式,而不只是殺死線程,而我不知道它在哪個狀態。從外部停止套接字讀取操作的優雅方法
所以我決定客戶端會話對象得到一個「停止'標誌可以從外部設置並在每個動作之前進行檢查。問題是它不應該等待客戶端,如果它只是在等待請求。我有以下的臨時解決方案:
def read_client
loop do
begin
timeout(1) { return @client.gets }
rescue Timeout::Error
if @stop
stop # Notifies the client and closes the connection
return nil
end
end
end
end
但是,吸,看起來很可怕,直觀地,這應該是必須有一個'正常」的解決方案,它這樣一個很正常的事情。我甚至不知道它是否安全,或者可能發生gets操作讀取客戶端請求的一部分,但不是全部。 另一個問題是,如果設置/獲取布爾標誌是Ruby中的一個原子操作(或者如果我需要一個額外的互斥標誌)。
好吧,我明白了,我只是認爲使用事件對於這樣一個簡單的應用來說有點複雜,但是你當然是對的,我應該使用事件。唯一的問題是我使用與普通套接字不同的Socket類。我使用加密,並受Ruby SSL庫的啓發,我將它作爲一個封裝套接字來實現,它又是一個IO對象。但是我會看看這些文檔,看看我能找到什麼。 – Lykos
很抱歉接受這麼晚,但我第一次不想接受它,因爲它沒有真正回答這個問題,但是再一次,我最終完全重新設計它,你的帖子是我這樣做的原因之一。 – Lykos