2009-12-28 5 views
6

In Rails, was wäre der beste Weg, einen UDP-Überwachungsprozess zu integrieren, der bestimmte Elemente des Modells aktualisiert (insbesondere das Hinzufügen von Zeilen zu einer der Tabellen).Unterstützt Rails eine ordentliche Art, einen UDP-Socket zu hören?

Die einfache Antwort scheint ein Thread mit dem UDP-Socket-Objekt innerhalb des gleichen Prozesses zu starten, aber es ist nicht klar, wo ich auch das tun sollte, was mit den Schienen Weg passt. Gibt es eine gute Möglichkeit, UDP zu hören? Insbesondere würde ich gerne in der Lage sein, einen UDPController zu schreiben und eine bestimmte Methode für jede Datagram-Nachricht aufzurufen. Idealerweise würde ich vermeiden wollen, HTTP über UDP zu verwenden (da es einiges von dem verschwenden würde, was in diesem Fall sehr wertvollen Speicherplatz ist), aber ich habe die volle Kontrolle über das Nachrichtenformat, so dass ich Rails mit allen Informationen versorgen kann, die es benötigen würde.

+0

Ich habe so ziemlich das gleiche Bedürfnis. Hast du eine befriedigende Lösung gefunden? – timeon

Antwort

1

Rails ist ein Webanwendungs-Framework, kein Server-Daemon-Framework. Wenn Sie keinen Webserver kennen, der UDP-Pakete weitergibt, müssen Sie einen separaten Prozess schreiben und ausführen und entweder über HTTP mit Ihrer Rails-App kommunizieren oder die Datenbank direkt bearbeiten.

2

Lassen Sie mich ein Pitch für TCP machen. UDP ist ein "Wirf das Paket zum Wind" -Protokoll, das keine Zuverlässigkeit bietet. B. in Voice-over-IP, wo das ungerade abgeworfene Paket akzeptabel ist. Durch die Verwendung eines TCP-Sockets können Sie immer noch vermeiden, HTTP zu verwenden, und der TCP-Stack wird die Wiederholungen & usw. für Sie übernehmen.

Ein TCP-Server, der von inetd gestartet wird, ist die einfachste Sache der Welt: Sie schreiben ein Programm, das von stdin liest und nach stdout schreibt, dann inetd, dieses Programm auszuführen, wenn Anfragen an einem bestimmten Port eingehen. Sie müssen keinen Netzwerkcode schreiben.

Hier ist ein einfacher inetd TCP-Server:

#!/usr/bin/ruby1.8 

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

Hier ist, wie inetd zu sagen, es laufen zu lassen:

1024   stream tcp  nowait wconrad /tmp/tcpserver.rb 

Das bedeutet für TCP-Verbindungen auf Port hört 1024. Wenn sie auftreten, starten /tmp/tcpserver.rb als Benutzer wconrad. man inetd.conf für weitere Informationen.

Sie können es mit Telnet-Test:

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

Oder Sie können einen einfachen Client verwenden:

$ 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 

und nur der TCP-Server in Ruby zu zeigen, ist einfach:

!/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 

Da TCP so einfach ist, brauchen Sie einen zwingenden Grund, sich mit UDP zu beschäftigen.