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")

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top