2013-03-12 107 views
4

基本上,我們有大量(100多個)遠程嵌入式設備,我們需要從中傳輸數據。許多客戶端連接Ruby

我可以連接到下面的代碼的任何單個遠程主機:

require 'socket' 

socket = TCPSocket.new '192.168.1.115', 8016 

loop do 
    socket.write("GET_DATA") 
    data = socket.read(32) 
end 

s.close 

但我想連接到許多人的一次。有推薦的方法嗎?

+0

當你說「一次」,你的意思是異步嗎?如果是這樣,請啓動[在新線程中]的每個連接(http://ruby-doc.org/core-2.0/Thread.html)。 – 2013-03-12 16:22:07

回答

4

使用線程:

ips = ['192.168.1.115', '...', '...'] 
threads = [] 

ips.each do |ip| 
    threads << Thread.new do 
    # Connect here, do some stuff with the socket 
    end 
end 

threads.each { |t| t.join } 

需要注意的是,如果你想真正的線程,你應該使用的JRuby或Ruby> = 1.9時,MRI紅寶石< 1.9(標準紅寶石)線程實現模擬線程(green threads),和只有當一個線程正在等待I/O時才進行真正的線程化。

+1

Ruby 1.9.x和現在穩定的Ruby 2.0(基於YARV)使用*本機線程*(如果受OS支持)。另一方面,你必須仍然對抗GIL。 – 2013-03-12 16:51:55

+0

謝謝,這絕對解決了我的問題! – drewbug 2013-03-12 16:56:21

+0

@DavidUnric不知道,感謝精確性,我甚至認爲ruby 2.0使用綠色線程。 – Intrepidd 2013-03-12 17:46:50