【发布时间】:2013-05-05 10:06:56
【问题描述】:
使用TCPSocket,我需要socket.puts "foobar",然后socket.close让socket在另一边socket.read消息。
有没有办法通过套接字发送或接收消息,但不关闭套接字,这意味着我可以再次发送消息而无需再次创建套接字?
p.s 类似 websocket 的东西
【问题讨论】:
使用TCPSocket,我需要socket.puts "foobar",然后socket.close让socket在另一边socket.read消息。
有没有办法通过套接字发送或接收消息,但不关闭套接字,这意味着我可以再次发送消息而无需再次创建套接字?
p.s 类似 websocket 的东西
【问题讨论】:
如果你向上遍历超类链,你最终会看到你继承自IO。大多数 IO 对象在 Ruby 中缓冲数据,以便更高效地从磁盘写入和读取。
在您的情况下,缓冲区不够大(或没有经过足够的时间)来冲洗掉。但是,当您关闭套接字时,这会强制刷新缓冲区资源。
你有几个选择:
IO#flush 手动强制刷新缓冲区。IO#sync= 设置为true,将缓冲区设置为在写入/读取后始终同步。您可以使用IO#sync 检查您的IO 对象的同步状态;我猜你会看到socket.sync #=> false
BasicSocket#send,这将是call POSIX send(2);由于套接字是 initialized 并设置了 O_FSYNC,因此发送将是同步的和原子的。【讨论】:
sync。查看源代码,套接字是 initialized 和 O_FSYNC 设置和 #send 只是调用 POSIX send(2)
puts,而不是send,它确实通过了sync 控制的内部缓冲逻辑
不必为了让对方阅读而关闭连接。 send 应该立即通过连接传输数据。确保对方正在从套接字读取。
【讨论】: