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,为什么,这是什么?
一个非常微妙的竞争条件。您正在关闭连接服务器端而不等待客户端完成。如果你的客户端在 s.close 之前完成,你将得到正确的答案,如果服务器先完成,你将得到 Errno::ECONNRESET。这意味着客户端在工作时失去了连接。
一个简单的解决方法是在关闭连接服务器端之前等待固定的时间。只要有足够的时间让客户完成即可。