2009-12-28 15 views
6

In Rails quale sarebbe il modo migliore di integrare un processo di ascolto UDP che aggiornasse determinati elementi del modello (in particolare aggiungendo le righe a una delle tabelle).Rails supporta un modo pulito di ascoltare un socket UDP?

La risposta semplice sembra essere avviare un thread con l'oggetto socket UDP all'interno dello stesso processo, ma non è chiaro dove dovrei fare quello che si adatta al modo rail. C'è un modo pulito per iniziare ad ascoltare UDP? In particolare mi piacerebbe essere in grado di scrivere un UDPController e avere un particolare metodo chiamato su ogni messaggio Datagram. Idealmente, vorrei evitare di usare HTTP su UDP (dato che perderebbe parte di quello che in questo caso è uno spazio molto prezioso) ma ho il pieno controllo del formato del messaggio in modo da poter fornire a Rails qualsiasi informazione di cui avrebbe bisogno.

+0

Ho praticamente lo stesso bisogno. Hai avuto una soluzione soddisfacente? – timeon

risposta

1

Rails è un framework di applicazioni Web, non un framework daemon del server. A meno che tu non sappia di un server web che trasmette pacchetti UDP, immagino che tu debba scrivere ed eseguire un processo separato e farlo parlare alla tua app Rails via HTTP o semplicemente manipolare direttamente il database.

2

Lasciami fare un passo per TCP. UDP è un protocollo "lancia il pacchetto al vento" che non fornisce affidabilità. Trova usi, per esempio, voce su IP in cui il pacchetto dispari caduto è accettabile. Utilizzando un socket TCP, è ancora possibile evitare l'uso di HTTP, inoltre lo stack TCP gestirà i tentativi & ecc.

Un server TCP lanciato da inetd è la cosa più semplice del mondo: si scrive un programma che legge da stdin e scrive su stdout, quindi si dice inetd di eseguire quel programma ogni volta che le richieste arrivano su una determinata porta. Non dovrai scrivere alcun codice di rete.

Ecco un semplice server inetd tcp:

#!/usr/bin/ruby1.8 

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

Ecco come dire a inetd per eseguirlo:

1024   stream tcp  nowait wconrad /tmp/tcpserver.rb 

Questo significa ascoltare per le connessioni TCP sulla porta 1024. Quando si verificano, lancio /tmp/tcpserver.rb come utente wconrad. man inetd.conf per ulteriori informazioni.

È possibile verificare 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. 
$ 

Oppure si può utilizzare un semplice client:

$ 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 

e solo per mostrare che i server TCP in Ruby sono facili:

!/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 essere così facile, è necessario un motivo convincente per preoccuparsi di UDP.

Problemi correlati