簡體   English   中英

Ruby TCP / IP客戶端線程

[英]Ruby TCP/IP Client Threading

我正在將ruby socket用於簡單的乒乓場景。 (客戶端正在將字符串發送到服務器,而服務器正在將字符串發送回-僅此而已)

簡單客戶端:

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

這里的問題是,每個線程似乎都使用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" ]

這是怎么回事?

您所有的線程都共享同一個套接字。 您將消息寫入套接字,然后所有5個線程都在等待數據可供讀取。

根據另一端的行為,網絡堆棧中的緩沖等可能會以一個塊或多個塊的形式返回。 在您的特定情況下,數據以一個塊的形式出現,而一個線程恰好很幸運。

要獲得所需的行為,您應該為每個線程使用一個套接字。

暫無
暫無

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

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