From: Robert Klemme Date: 2011-02-21T23:54:22+09:00 Subject: Re: Using Ruby to connect with multiple IP Input output interface, Netiom. On Mon, Feb 21, 2011 at 3:15 PM, Nick Jackson wrote: > I am trying to create an application written in ruby which communicates > with multiple input/output interfaces over TCP/IP. The IO interface I am > using is called a NETIOM. The interface has 16 digital inputs and 16 > digital outputs. For us it is more important to know the protocol that this device speaks (I mean the _network_ protocol which you are trying to utilize). > This code works for one Netiom device and is also able to detect inputs > being pressed but the code exits after a little while. I have been > experimenting with classes and arrays but not getting anywhere. > > require 'socket' > server = TCPServer.open(3012) > @socket = server.accept > @socket.puts "SEND\r\n" This should be @socket.write "SEND\r\n". > while line = @socket.gets If your line terminator is "\r\n" then you probably also want to use TERM = "\r\n".freeze while line = @socket.gets TERM >  puts line.chop I'd rather use line.chomp! TERM > end > > this code returns: > > Digital inputs 1-8 : 11111111 > Digital inputs 9-16: 11111111 > Digital outputs 1-8 : 00000000 > Digital outputs 9-16: 00000000 > > > It would be great if I can have some help with the following: >   > handling multiple interfaces Not sure what that means. Do you want multiple clients to connect? >   > being able to send a message to a single interface and then see its > response You may want to look at IO#expect ("ri19 IO#expect"). >   > 'doing something' when an input is triggered and being able to > identify which input and interface it was triggered on. > > Take a look at this for more info. > http://stackoverflow.com/questions/5066943 I'd start by creating a handler class per connection. This could look like this: require 'socket' class DeviceHandler TERM = "\r\n".freeze def initialize(socket) @socket = socket @thread = Thread.new do @socket.each_line TERM do |line| data = parse(line) end end end # more methods... private def send(...) @socket.write(... + TERM) end end server = TCPServer.open(3012) handlers = [] while (client = server.accept) handlers << DeviceHandler.new(client) end But how this is really set up (and especially if you need to start a thread in the constructor) hugely depends on the protocol spoken by the device and what you want to do with it. Cheers robert -- remember.guy do |as, often| as.you_can - without end http://blog.rubybestpractices.com/