Pergunta

Estou criando um servidor de rubi que está se conectando a um cliente TCP. Meu servidor está usando uma TCPServer e eu estou tentando usar TCPServer :: recv (), mas não esperar por dados, por isso continua em um loop até que os dados são recebidos.

O que é a forma mais eficiente para processar dados intermitente? Eu sou incapaz de alterar os dados enviados desde que eu estou tentando emular outro servidor. Que ler como declaração de TCPServer / TcpSocket iria esperar por dados enviados?


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

Obrigado pelo seu tempo.

Foi útil?

Solução

Tem certeza recv não está retornando "" - ou seja, o socket está fechado? Se não, então talvez seus soquetes estão definidas para não bloqueio de alguma forma?

EventMachine é realmente muito mais rápido do que usar tópicos para programação de socket :) GL. -r

Outras dicas

Com base nas perguntas que você está pedindo, eu acho que você deve tentar um quadro como EventMachine e escrever um servidor que implementa o que você quer em vez de tentar mexer com cerca de escrever um invólucro servidor.

Dito isto, a forma mais eficiente para ler a partir de uma tomada é usar um seleto chamada adequada e consultar todas as conexões abertas. Enquanto isso é uma coisa bastante acadêmica para qualquer um que é aplicações cliente-servidor desenvolvidos antes, é um incômodo porque há um monte de coisas que você pode facilmente obter errado. Por exemplo. lidar com múltiplas conexões pode levar a todos os tipos de problemáticas situações se você não tiver um cuidado especial para evitar o bloqueio de chamadas.

O quadro EventMachine torna mais fácil para desenvolver servidores de consulta / tipo de resposta porque você sempre pode começar com um modelo e trabalhar a partir daí, por exemplo, o built-in EventMachine :: Protocolos :: LineAndTextProtocol um funciona como uma grande base para a maioria.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top