0

TCP クライアントに接続する Ruby サーバーを作成しています。私のサーバーは TCPServer を使用しており、TCPServer::recv() を使用しようとしていますが、データを待機しないため、データが受信されるまでタイトなループが続きます。

断続的なデータを処理する最も効率的な方法は何ですか? 別のサーバーをエミュレートしようとしているため、送信されるデータを変更できません。データが送信されるのを待つ TCPServer/TCPSocket からの read like ステートメントはどれですか?


    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

2 に答える 2

0

recv が "" を返さないのは確かですか? -- ソケットが閉じていることを意味しますか? そうでない場合は、ソケットが非ブロッキングに設定されている可能性がありますか?

EventMachine は、ソケット プログラミングにスレッドを使用するよりもはるかに高速です :) GL. -r

于 2009-09-21T23:14:21.877 に答える
0

あなたが尋ねてきた質問に基づいて、EventMachine のようなフレームワークを試して、サーバー ラッパーを書くことで大騒ぎするのではなく、必要なものを実装するサーバーを作成する必要があると思います。

そうは言っても、ソケットから読み取る最も効率的な方法は、適切な選択呼び出しを使用して、開いているすべての接続をポーリングすることです。これは、以前にクライアント サーバー アプリケーションを開発したことがある人にとってはかなり学問的なことですが、間違いやすいことがたくさんあるので厄介です。例えば。複数の接続を処理すると、呼び出しをブロックしないように特に注意しないと、あらゆる種類の厄介な状況につながる可能性があります。

EventMachine フレームワークを使用すると、クエリ/応答タイプのサーバーを簡単に開発できます。これは、テンプレートから始めてそこから作業できるためです。

于 2009-09-21T20:26:50.390 に答える