使用TCPSocket
,我需要socket.puts "foobar"
,然後socket.close
讓socket在另一端socket.read
的消息中。如何使用Ruby維護TCP連接?
有沒有辦法通過套接字發送或接收消息,但沒有關閉套接字,這意味着我可以再次發送消息而無需再次創建套接字?喜歡的WebSocket
使用TCPSocket
,我需要socket.puts "foobar"
,然後socket.close
讓socket在另一端socket.read
的消息中。如何使用Ruby維護TCP連接?
有沒有辦法通過套接字發送或接收消息,但沒有關閉套接字,這意味着我可以再次發送消息而無需再次創建套接字?喜歡的WebSocket
如果你遍歷超級鏈,你將最終看到你繼承自IO
。在Ruby中,大多數IO
對象緩衝數據以更高效地從磁盤讀寫。
在你的情況下,緩衝區不夠大(或沒有足夠的時間沒有通過)來清除它。但是,當您關閉套接字時,會強制刷新緩衝區資源。
您有幾種選擇:
IO#flush
刷新。IO#sync=
設置爲true
,您可以在寫入/讀取後將緩衝區設置爲始終同步。您可以使用IO#sync
檢查您的IO
對象同步的狀態;我猜你會看到socket.synC#=> false
BasicSocket#send
這將call POSIX send(2)
;由於套接字是initialized而O_FSYNC
集,發送將是同步的和原子的。P.S東西它不應該是neccessary關閉連接,以便對方閱讀。 send
應立即通過連接傳輸數據。確保對方正在讀取插座。
+1'send'工作 – mko 2013-05-06 08:32:15
不應該在套接字上設置sync。查看源代碼,套接字使用['O_FSYNC'](https:// github)[初始化](https://github.com/ruby/ruby/blob/trunk/ext/socket/init.c#L67) com/ruby/ruby/blob/trunk/io.c#L5526-5530)set和['#send'](https://github.com/ruby/ruby/blob/trunk/ext/socket/basicsocket.c #L561-L573)只是調用POSIX ['send(2)'](https://github.com/ruby/ruby/blob/trunk/ext/socket/init.c#L86) – dbenhur 2013-05-05 16:35:07
嗯,忽略OP是使用'puts',而不是'send',那會經歷由'sync'控制的內部緩衝邏輯。 – dbenhur 2013-05-05 16:40:32
謝謝,使用該選項更新了答案以及 – 2013-05-05 16:48:32