2013-03-12 95 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