2009-09-21 86 views
0

我有一个客户端和服务器。我启动服务器,并运行客户端,并在第一次正常工作。第二次运行客户端(不重新启动服务器)时,客户端似乎挂起。任何人都可以看到什么是错的?Ruby TCPSocket不断丢失连接

我有一个客户:

 

# 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") 

回答

2

服务器每个连接都需要一个单独的接受呼叫被接纳订单。发生的事情是,您接受第一个,使用它,然后在使套接字处于监听状态时有效终止。这意味着连接将被打开,但不被接受,所以它们按照你描述的方式挂起。

使用更强大的服务器框架可能会更好。 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 

现在接受电话被包裹在一个循环,使多个连接可以被处理。