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.
Mam prawie tę samą potrzebę. Czy masz satysfakcjonujące rozwiązanie? – timeon