使用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