2013-05-05 63 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