Ruby TCP / IP客户端线程

时间:2012-09-03 15:51:46

标签: ruby multithreading tcp client

我正在使用ruby套接字来实现一个简单的乒乓球场景。 (客户端正在向服务器发送一个字符串,服务器正在发回字符串 - 这就是全部)

简单客户:

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

它工作正常,直到Threads发挥作用:

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" ]

这里的问题是每个Thread似乎都“侦听”来自服务器的响应,并使用socket.gets,因此任意一个Thread将从服务器接收所有响应,正如您从输出中看到的那样。 优选地,每个线程应该接收它自己的响应,输出应该看起来不像

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" ]

这是什么交易?

1 个答案:

答案 0 :(得分:0)

所有线程共享同一个套接字。您将消息写入套接字,然后所有5个线程都在等待数据可供读取。

取决于另一端的行为,网络堆栈中的缓冲等可以返回一个块或多个块。在您特定的情况下,数据出现在一个块中,一个线程碰巧变得幸运。

要获得所需的行为,每个线程应使用一个套接字。