Socket.recv有效但无法获取或读取?

Ear*_*rlz 5 ruby sockets networking

您好,我一直在使用Ruby中的套接字,并且遇到了一些我尝试修改和破坏的示例代码.我想知道为什么它被打破了.

服务器:

require "socket"  
dts = TCPServer.new('127.0.0.1', 20000)  
loop do  
  Thread.start(dts.accept) do |s|  
  print(s, " is accepted\n")  
  s.write(Time.now)  
  print(s, " is gone\n")  
  s.close  
  end  
end  
Run Code Online (Sandbox Code Playgroud)

有效的客户:

require 'socket'  
streamSock = TCPSocket.new( "127.0.0.1", 20000 )  
streamSock.print( "Hello\n" )  
str = streamSock.recv( 100 )  
print str  
streamSock.close 
Run Code Online (Sandbox Code Playgroud)

客户端坏了

require 'socket'  
streamSock = TCPSocket.new( "127.0.0.1", 20000 )  
streamSock.print( "Hello\n" )  
str=streamSock.read #this line modified
print str  
streamSock.close 
Run Code Online (Sandbox Code Playgroud)

我知道这streamSock.print是不必要的(以及命名方案是非ruby),但我不明白为什么read不工作recv,为什么,这是什么?

Pab*_*zzi 1

一个非常微妙的竞争条件。您正在关闭连接服务器端而不等待客户端完成。如果你的客户端在 s.close 之前完成,你将得到正确的答案,如果服务器先完成,你将得到 Errno::ECONNRESET。这意味着客户端在工作时失去了连接。

一个简单的解决方法是在关闭连接服务器端之前等待固定的时间。只要有足够的时间让客户完成即可。