2009-12-28 9 views
6

W Railsach, jaki byłby najlepszy sposób integracji procesu odsłuchu UDP, który zaktualizował niektóre elementy modelu (konkretnie będzie dodawał wiersze do jednej z tabel).Czy Rails obsługuje czysty sposób słuchania gniazda UDP?

Prostą odpowiedzią wydaje się być uruchomienie wątku z obiektem gniazda UDP w ramach tego samego procesu, ale nie jest jasne, gdzie powinienem zrobić to, co pasuje do szyn. Czy istnieje sposób na rozpoczęcie słuchania UDP? W szczególności chciałbym móc napisać kontroler UDP i mieć konkretną metodę wywoływaną na każdej wiadomości Datagram. Idealnie chciałbym uniknąć używania HTTP przez UDP (ponieważ mogłoby to zmarnować część tego, co w tym przypadku jest bardzo cenną przestrzenią), ale w pełni kontroluję format wiadomości, więc mogę dostarczyć Railsom wszelkie potrzebne informacje.

+0

Mam prawie tę samą potrzebę. Czy masz satysfakcjonujące rozwiązanie? – timeon

Odpowiedz

1

Rails jest szkieletem aplikacji WWW, a nie demonem serwera. O ile nie znasz serwera WWW, który przekazuje pakiety UDP, wyobrażam sobie, że musiałbyś napisać i uruchomić oddzielny proces i albo rozmawiał z twoją aplikacją Railsową przez HTTP, albo po prostu manipulował bazą danych bezpośrednio.

2

Pozwól mi zrobić tonację dla TCP. UDP jest protokołem "throw the packet to the wind", który nie zapewnia niezawodności. Znajduje zastosowanie w, na przykład, Voice over IP, w którym nieparzysty upuszczony pakiet jest akceptowalny. Korzystając z gniazda TCP, nadal można uniknąć używania protokołu HTTP, a stos TCP będzie obsługiwać powtórkę dla Ciebie: & itd.

Serwer TCP uruchamiany przez inetd to najprostsza rzecz na świecie: piszesz program czytający ze standardowego wejścia i wyjścia na standardowe wyjście, a następnie powiadamia inetd, aby uruchamiał ten program, gdy tylko pojawią się żądania na określonym porcie. Nie będziesz musiał pisać żadnego kodu sieciowego.

Oto prosty serwer inetd tcp:

#!/usr/bin/ruby1.8 

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

Oto jak powiedzieć inetd, aby go uruchomić:

1024   stream tcp  nowait wconrad /tmp/tcpserver.rb 

Oznacza to, słuchać dla połączeń TCP na porcie 1024. Kiedy występują, uruchomienie /tmp/tcpserver.rb jako użytkownik wconrad. man inetd.conf, aby uzyskać więcej informacji.

Można przetestować go z telnet:

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

Albo można użyć prostego klienta:

$ 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 

i po prostu pokazać, że serwery TCP w Ruby są proste:

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

Przy tak prostym TCP, potrzebujesz powód, by zawracać sobie głowę UDP.

Powiązane problemy