Rubino TCPSocket continua a perdere il collegamento
Domanda
Ho un client e server. Comincio il server, ed eseguire il client, e la prima volta funziona benissimo. La seconda volta ho eseguito il cliente (senza riavviare il server), il client sembra bloccarsi. chiunque può vedere ciò che è sbagliato?
Ho 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
E server:
# 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")
Soluzione
Ogni connessione al server richiede un accettare chiamata separata al fine di essere ricevuto. Quello che sta succedendo è che si sta accettando la prima, lavorare con esso, e quindi in modo efficace che chiude lasciando la presa in uno stato di ascolto. Questo significa che saranno aperti i collegamenti, ma non accettato, in modo da appendere come si descrive.
Si potrebbe essere meglio utilizzare un quadro di server più robusta. EventMachine ( http://rubyeventmachine.com/ ) è un po 'difficile da imparare, ma è molto più potente di un rotolare la vostra soluzione.
Ecco una soluzione rapida che potrebbe aiutare:
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
Ora la chiamata accettare è avvolto in un ciclo in modo più di una connessione può essere elaborata.