Rubi TcpSocket mantém conexão perdida
Pergunta
Eu tenho um cliente e servidor. Eu iniciar o servidor e executar o cliente, ea primeira vez que ele funciona bem. A segunda vez que executar o cliente (sem reiniciar o servidor), o cliente parece travar. qualquer um pode ver o que está errado?
Eu tenho um 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
E 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")
Solução
Cada conexão com o servidor requer um separado aceitar chamada, a fim de ser recebido. O que está acontecendo é que você está aceitando o primeiro, de trabalhar com ele, e, em seguida, efetivamente terminando deixando o soquete em um estado de escuta. Este conexões via serão abertos, mas não aceitos, assim que pendurar como você descreve.
Você pode ser melhor fora de usar uma estrutura de servidor mais robusto. EventMachine ( http://rubyeventmachine.com/ ) é um pouco complicado para aprender, mas é muito mais poderoso do que um rolar sua própria solução.
Aqui está uma solução rápida que pode ajudar:
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
Chamada Agora a aceitar é envolto em um loop para mais de uma conexão pode ser processado.