2013-05-05 57 views
0

使用TCPSocket,我需要socket.puts "foobar",然後socket.close讓socket在另一端socket.read的消息中。如何使用Ruby維護TCP連接?

有沒有辦法通過套接字發送或接收消息,但沒有關閉套接字,這意味着我可以再次發送消息而無需再次創建套接字?喜歡的WebSocket

回答

3

如果你遍歷超級鏈,你將最終看到你繼承自IO。在Ruby中,大多數IO對象緩衝數據以更高效地從磁盤讀寫。

在你的情況下,緩衝區不夠大(或沒有足夠的時間沒有通過)來清除它。但是,當您關閉套接字時,會強制刷新緩衝區資源。

您有幾種選擇:

  • 您可以手動強制緩衝使用IO#flush刷新。
  • 通過將IO#sync=設置爲true,您可以在寫入/讀取後將緩衝區設置爲始終同步。您可以使用IO#sync檢查您的IO對象同步的狀態;我猜你會看到socket.synC#=> false
  • 使用BasicSocket#send這將call POSIX send(2);由於套接字是initializedO_FSYNC集,發送將是同步的和原子的。
+0

不應該在套接字上設置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

+0

嗯,忽略OP是使用'puts',而不是'send',那會經歷由'sync'控制的內部緩衝邏輯。 – dbenhur 2013-05-05 16:40:32

+0

謝謝,使用該選項更新了答案以及 – 2013-05-05 16:48:32

1

P.S東西它不應該是neccessary關閉連接,以便對方閱讀。 send應立即通過連接傳輸數據。確保對方正在讀取插座。

+0

+1'send'工作 – mko 2013-05-06 08:32:15