簡體   English   中英

Ruby TCPSocket不斷丟失連接

[英]Ruby TCPSocket keeps losing connection

我有一個客戶端和服務器。 我啟動服務器,並運行客戶端,並且第一次運行良好。 第二次運行客戶端(不重新啟動服務器)時,客戶端似乎掛起。 誰能看到錯在哪里?

我有一個客戶:


# 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

現在,accept調用被包裝在一個循環中,因此可以處理多個連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM