Pregunta

Estoy creando un servidor de rubí que se conecta a un cliente TCP. Mi servidor está utilizando un TCPServer y estoy tratando de utilizar TCPServer :: recv (), pero no espera a los datos, por lo que sólo continúa en un bucle estrecho hasta que se reciben los datos.

¿Cuál es la forma más eficiente para procesar los datos intermitente? Soy incapaz de cambiar los datos que se envían en el puesto que estoy tratando de emular a otro servidor. El cual se leen como declaración de TCPServer / TCPSocket que esperar a que los datos que se envían?


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

Gracias por su tiempo.

¿Fue útil?

Solución

¿Está seguro recv es no regresar "" - es decir, el socket está cerrado? Si no, entonces tal vez sus tomas se establecen para no bloqueo de alguna manera?

EventMachine es de hecho mucho más rápido que el uso de hilos de la programación del zócalo :) GL. -r

Otros consejos

Sobre la base de las preguntas que he estado haciendo, creo que se debe tratar de un marco como EventMachine y escribir un servidor que implementa lo que quiere en vez de intentar quejarse alrededor con la escritura de un envoltorio de servidor.

Una vez dicho esto, la forma más eficiente para leer desde una toma de corriente es utilizar una selección de llamada adecuada y sondear todas las conexiones abiertas. Si bien esto es una cosa bastante académico para cualquier persona que ha desarrollado aplicaciones cliente-servidor antes, es una molestia porque hay una gran cantidad de cosas que se pueden conseguir fácilmente mal. Por ejemplo. manejar múltiples conexiones puede dar lugar a todo tipo de situaciones problemáticas si no eres especial cuidado para evitar el bloqueo de llamadas.

El marco EventMachine hace que sea fácil de desarrollar servidores de pregunta / respuesta de tipo porque se puede empezar siempre con una plantilla y trabajar desde allí, por ejemplo, la incorporada en EventMachine :: :: Protocolos LineAndTextProtocol uno funciona como una gran base para la mayoría.

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