2009-09-21 39 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 

現在接受電話被包裹在一個循環,使多個連接可以被處理。