【问题标题】:How to maintain the TCP connection using Ruby?如何使用 Ruby 维护 TCP 连接?
【发布时间】:2013-05-05 10:06:56
【问题描述】:

使用TCPSocket,我需要socket.puts "foobar",然后socket.close让socket在另一边socket.read消息。

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

p.s 类似 websocket 的东西

【问题讨论】:

    标签: ruby tcpsocket


    【解决方案1】:

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

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

    你有几个选择:

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

    【讨论】:

    • 不必在套接字上设置sync。查看源代码,套接字是 initializedO_FSYNC 设置和 #send 只是调用 POSIX send(2)
    • 嗯,忽略了 OP 使用的是puts,而不是send,它确实通过了sync 控制的内部缓冲逻辑
    • 很好的答案!我已经尝试了所有三种解决方案,一切正常,感谢指出底层 POSIX 操作
    【解决方案2】:

    不必为了让对方阅读而关闭连接。 send 应该立即通过连接传输数据。确保对方正在从套接字读取。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-31
      • 1970-01-01
      • 1970-01-01
      • 2020-08-12
      • 2017-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多