0

クライアントとサーバーがあります。サーバーを起動し、クライアントを実行すると、最初は正常に動作します。クライアントを (サーバーを再起動せずに) 2 回目に実行すると、クライアントがハングしたように見えます。誰が何が間違っているかを見ることができますか?

クライアントがいます:


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

4

1 に答える 1

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

現在、accept 呼び出しはループでラップされているため、複数の接続を処理できます。

于 2009-09-21T19:48:02.980 に答える