如何使用Ruby维护TCP连接?

时间:2013-05-05 10:06:57

标签: ruby tcpsocket

使用TCPSocket,我需要socket.puts "foobar",然后socket.close让对方的套接字socket.read消息。

有没有办法通过套接字发送或接收消息,但没有关闭套接字,这意味着我可以再次发送消息而不再创建套接字?

p.s像websocket

之类的东西

2 个答案:

答案 0 :(得分:3)

如果你遍历超类链,你最终会看到你继承自IO。在Ruby中,大多数IO对象缓冲数据,以便更有效地从磁盘写入和读取。

在你的情况下,缓冲区不够大(或没有足够的时间没有通过),因为它要冲洗掉。但是,当您关闭套接字时,这会强制刷新缓冲区资源。

您有几个选择:

  • 您可以使用IO#flush手动强制缓冲区刷新。
  • 通过将IO#sync=设置为true,您可以将缓冲区设置为在写入/读取后始终同步。您可以使用IO#sync检查IO对象的同步状态;我猜你会看到socket.sync #=> false
  • 使用BasicSocket#send POSIX callsend(2);由于套接字为initialized并设置了O_FSYNC,因此发送将是同步和原子的。

答案 1 :(得分:1)

关闭连接以便另一方阅读它是不必要的。 send应立即通过连接传输数据。确保对方正在从插座中读取。