O que é a maneira mais eficiente para ler TCPServer?
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.
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.