1

シンプルなピンポン シナリオに ruby​​ ソケットを使用しています。(クライアントはサーバーに文字列を送信し、サーバーは文字列を送り返します-それだけです)

シンプル クライアント:

socket = TCPSocket.new "localhost", 5555
socket.write "test-string\n"
puts socket.gets.inspect

スレッドが機能するまで、問題なく動作しています:

socket = TCPSocket.new "localhost", 5555
threads = []

5.times do |t|
  threads << Thread.new(t) do |th|

    socket.write "#{t}\n"

    puts "THREAD: #{t} --> [ #{socket.recv(1024).inspect} ]"

  end
end

threads.each { |th| th.join }

# Output: THREAD: 3 --> [ "0\r\n1\r\n2\r\n3\r\n4\r\n" ]

ここでの問題は、出力からわかるように、各スレッドが socket.gets を使用してサーバーからの応答を「リッスン」しているように見え、その結果、任意のスレッドがサーバーからすべての応答を受信することです。できれば、各スレッドは独自の応答を受け取る必要があり、出力は次のようにはなりません。

THREAD: 3 --> [ "0\r\n1\r\n2\r\n3\r\n4\r\n" ]

しかし、むしろ好きです:

THREAD: 0 --> [ "0\r\n" ]
THREAD: 1 --> [ "1\r\n" ]
THREAD: 2 --> [ "2\r\n" ]
THREAD: 3 --> [ "3\r\n" ]
THREAD: 4 --> [ "4\r\n" ]

ここでの取引は何ですか?

4

1 に答える 1

0

すべてのスレッドが同じソケットを共有しています。メッセージをソケットに書き込むと、5つのスレッドすべてが、データが読み取れるようになるのを待っています。

もう一方の端の動作に応じて、1つのチャンクまたは複数のチャンクに戻る可能性のあるネットワークスタックなどのバッファリング。特定の状況では、データは1つのチャンクに表示され、1つのスレッドがたまたま幸運になります。

必要な動作を得るには、スレッドごとに1つのソケットを使用する必要があります。

于 2012-09-03T16:52:23.680 に答える