Ruby TCPSocket写不起作用,但是put呢?

时间:2009-07-18 15:46:23

标签: ruby sockets tcp

我正在使用GServer和TCPSocket处理Ruby TCP客户端/服务器应用程序。我遇到了一个我不明白的问题。我的TCPSocket客户端成功连接到我的GServer,但我只能使用puts发送数据。调用TCPSocket.send或TCPSocket.write什么都不做。是否有一些我不知道的魔法?

tcp_client = TCPSocket.new( ipaddr, port )
tcp_client.puts( 'Z' ) # -> GServer receives "Z\n"

但如果我使用写或发送......

tcp_client = TCPSocket.new( ipaddr, port )
tcp_client.write( 'Z' ) # -> nothing is received
tcp_client.send( 'Z' ) # -> nothing is received

感谢您的帮助

其他信息:

  1. Linux和Linux上的行为相同视窗。
  2. 写入后刷新套接字不会改变行为。

5 个答案:

答案 0 :(得分:4)

您确定问题不在服务器端吗?您是否正在使用某种方法来读取需要字符串或以“\ n”结尾的内容?

答案 1 :(得分:4)

在先前的帖子中处理缓冲以解决数据是否正在发送的问题,考虑使用wireshark之类的内容捕获数据。如果在线上看到您发送的数据,则服务器没有收到它。

否则,如果数据没有进入该行,TCP可能会保留数据以避免发送仅包含少量字节的单个段(see Nagle's Algorithm)。根据您的操作系统或TCP供应商,您可能有不同的行为,但大多数TCP堆栈支持TCP_NODELAY选项,这可能有助于更及时地获取数据。

tcp_client.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)

这可以帮助调试,但如果吞吐量优先于响应速度,则通常不应该留在生产代码中。

答案 2 :(得分:2)

尝试明确刷新:

tcp_client = TCPSocket.new( ipaddr, port )
tcp_client.write( 'Z' ) 
tcp_client.send( 'Z' ) 
tcp_client.flush

这样,输出最多只会被缓冲,直到你决定发送它为止。

答案 3 :(得分:0)

嗨那里的原因应该是与你的字符串添加自动LF和CRL这一事实有关。 如果你想使用发送或写入,你需要自己添加它们,例如:

tcp_client.send(“Z \ r \ n”,0)

答案 4 :(得分:0)

我遇到了同样的问题,所以在读完套接字后,我必须明确删除" \ n"的最后一个实例。通过执行以下操作:

client_socket.gets.gsub(/\n$/, '')