题
我有一个客户端和服务器。我启动服务器,并运行在客户端,并在第一时间它工作正常。我运行客户端(无需重新启动服务器)的第二次,客户端似乎挂起。任何人都可以看到什么是错?
我有一个客户端:
# Code example originated from p069dtclient.rb at http://rubylearning.com/satishtalim/ruby_socket_programming.html
require 'socket'
x = 0;
streamSock = TCPSocket.new( 'localhost', 20000 )
while x < 10
streamSock.send( "Hello #{x}",0 )
str = streamSock.recv( 100 )
puts "#{x} " + str
x=x+1
end
streamSock.close
和服务器:
# p068dtserver.rb
require "socket"
dts = TCPServer.new('localhost', 20000)
s = dts.accept
print(s, " is accepted\n")
loopCount = 0;
loop do
Thread.start(s) do
loopCount = loopCount + 1
lineRcvd = s.recv(1024)
if ( !lineRcvd.empty? )
puts("#{loopCount} Received: #{lineRcvd}")
s.write(Time.now)
end
end
end
s.close
print(s, " is gone\n")
解决方案
到服务器每个连接都需要一个单独的接受呼叫中所接收到的定单。发生了什么事是你正在接受第一,与它一起工作,并同时使插座处于监听状态,然后有效地终止。这意味着连接将被打开,但不能接受,所以他们挂你描述。
您可以使用更强大的服务器架构会更好。 EventMachine的( http://rubyeventmachine.com/ )是有点棘手学习,但远比一个更强大滚动您自己的解决方案。
下面是一个快速解决方案,可以帮助:
require "socket"
dts = TCPServer.new('localhost', 20000)
while (s = dts.accept)
print(s, " is accepted\n")
loopCount = 0;
loop do
Thread.start(s) do
loopCount = loopCount + 1
lineRcvd = s.recv(1024)
if ( !lineRcvd.empty? )
puts("#{loopCount} Received: #{lineRcvd}")
s.write(Time.now)
end
end
end
s.close
print(s, " is gone\n")
end
现在的呼叫接受被包裹在一个循环,以便一个以上的连接都可以加工。
不隶属于 StackOverflow