您好我一直在使用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
有效的客户:
require 'socket'
streamSock = TCPSocket.new( "127.0.0.1", 20000 )
streamSock.print( "Hello\n" )
str = streamSock.recv( 100 )
print str
streamSock.close
破产的客户
require 'socket'
streamSock = TCPSocket.new( "127.0.0.1", 20000 )
streamSock.print( "Hello\n" )
str=streamSock.read #this line modified
print str
streamSock.close
我知道streamSock.print
是不必要的(以及命名方案是非ruby)但我不明白为什么read
在recv
执行时不起作用,为什么是这样?
答案 0 :(得分:0)
非常微妙的竞争条件。您正在关闭连接服务器端而不等待客户端完成。如果您的客户在s.close之前完成,您将得到正确答案,如果服务器首先完成,您将获得Errno :: ECONNRESET。这意味着客户在工作时丢失了连接。
一个简单的解决方法是在关闭连接服务器端之前等待一段固定的时间。足够的时间让客户完成。