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.
Tengo prácticamente la misma necesidad. ¿Recibió una solución satisfactoria? – timeon