Rubí TCPSocket sigue perdiendo la conexión
Pregunta
Tengo un cliente y el servidor. Pongo en marcha el servidor y ejecutar el cliente, y la primera vez que trabaja muy bien. La segunda vez que ejecute el cliente (sin necesidad de reiniciar el servidor), el cliente parece bloquearse. ¿Alguien puede ver lo que está mal?
Tengo un cliente:
# Code example originated from p069dtclient.rb at http://rubylearning.com/satishtalim/ruby_socket_programming.html
require 'socket'
x = 0;
streamSock = TCPSocket.new( 'localhost', 20000 )
while x < 10
streamSock.send( "Hello #{x}",0 )
str = streamSock.recv( 100 )
puts "#{x} " + str
x=x+1
end
streamSock.close
Y servidor:
# p068dtserver.rb
require "socket"
dts = TCPServer.new('localhost', 20000)
s = dts.accept
print(s, " is accepted\n")
loopCount = 0;
loop do
Thread.start(s) do
loopCount = loopCount + 1
lineRcvd = s.recv(1024)
if ( !lineRcvd.empty? )
puts("#{loopCount} Received: #{lineRcvd}")
s.write(Time.now)
end
end
end
s.close
print(s, " is gone\n")
Solución
Cada conexión con el servidor requiere aceptar una llamada por separado con el fin de ser recibido. Lo que pasa es que usted está aceptando el primero, trabajar con él, y luego terminar con eficacia, dejando la toma en un estado de escucha. Esto significa que se abrirán las conexiones, pero no aceptó, por lo que cuelgan como usted la describe.
Usted puede ser mejor usar un marco de servidor más robusto. EventMachine ( http://rubyeventmachine.com/ ) es un poco difícil de aprender, pero es mucho más potente que una rodar su propia solución.
Aquí hay una solución rápida que podría ayudar:
require "socket"
dts = TCPServer.new('localhost', 20000)
while (s = dts.accept)
print(s, " is accepted\n")
loopCount = 0;
loop do
Thread.start(s) do
loopCount = loopCount + 1
lineRcvd = s.recv(1024)
if ( !lineRcvd.empty? )
puts("#{loopCount} Received: #{lineRcvd}")
s.write(Time.now)
end
end
end
s.close
print(s, " is gone\n")
end
Ahora la llamada aceptar se envuelve en un bucle de modo más de una conexión puede ser procesada.