2009-12-28 5 views
6

En Rails, ¿cuál sería la mejor manera de integrar un proceso de escucha UDP que actualiza ciertos elementos del modelo (específicamente va a agregar filas a una de las tablas).¿Rails es compatible con una forma ordenada de escuchar un socket UDP?

La respuesta simple parece ser iniciar un hilo con el objeto socket UDP dentro del mismo proceso, pero no está claro dónde debo hacer eso que se ajuste a la manera de los rieles. ¿Hay alguna forma de comenzar a escuchar UDP? Específicamente, me encantaría poder escribir un UDPController y tener un método particular llamado en cada mensaje de Datagram. Idealmente, me gustaría evitar el uso de HTTP sobre UDP (ya que desperdiciaría algo de lo que en este caso es un espacio muy valioso) pero tengo el control total del formato del mensaje para poder proporcionar a Rails toda la información que pueda necesitar.

+0

Tengo prácticamente la misma necesidad. ¿Recibió una solución satisfactoria? – timeon

Respuesta

1

Rails es un marco de aplicación web, no un marco daemon de servidor. A menos que sepa de un servidor web que pasa paquetes UDP, me imagino que tendría que escribir y ejecutar un proceso por separado y o bien hacer que hable con su aplicación Rails a través de HTTP o simplemente manipular la base de datos directamente.

2

Déjenme hacer un pitch para TCP. UDP es un protocolo de "tirar el paquete al viento" que no proporciona ninguna fiabilidad. Encuentra usos en, por ejemplo, voz sobre IP donde el paquete extraído es aceptable. Al usar un socket TCP, aún puede evitar el uso de HTTP, además de que la pila TCP manejará los reintentos & etc. por usted.

Un servidor TCP que es iniciado por inetd es lo más simple del mundo: usted escribe un programa que lee de stdin y escribe en stdout, luego le dice a inetd que ejecute ese programa cada vez que las solicitudes entren en un puerto determinado. No tendrá que escribir ningún código de red.

Aquí es un simple servidor inetd tcp:

#!/usr/bin/ruby1.8 

input = gets 
puts "You said: #{input}" 

es cómo decir inetd para ejecutarlo aquí:

1024   stream tcp  nowait wconrad /tmp/tcpserver.rb 

Esto significa para escuchar las conexiones TCP en el puerto 1024. Cuando ocurren, lanzamiento /tmp/tcpserver.rb como usuario wconrad. man inetd.conf para más información.

Puede probarlo con telnet:

$ telnet localhost 1024 
Trying 127.0.0.1... 
Connected to ceres. 
Escape character is '^]'. 
Howdy! 
You said: Howdy! 
Connection closed by foreign host. 
$ 

O puede utilizar un cliente simple:

$ cat /tmp/tcpclient.rb 
#!/usr/bin/ruby1.8 

require 'socket' 

t = TCPSocket.new('localhost', 1024) 
t.puts "Hello" 
t.close_write 
puts t.read 
t.close 

$ /tmp/tcpclient.rb 
You said: Hello 

y sólo para demostrar que los servidores TCP en Ruby son fáciles:

!/usr/bin/ruby1.8 

require 'socket' 

def handle_session(socket) 
    s = socket.gets 
    socket.puts "You said: #{s}" 
    socket.close 
end 

server = TCPServer.new('localhost', 1024) 
while (session = server.accept) 
    Thread.new do 
    handle_session(session) 
    end 
end 

Con TCP es tan fácil, necesita una razón convincente para molestarse con UDP.

Cuestiones relacionadas