我正在使用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
感谢您的帮助
其他信息:
答案 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$/, '')