Ruby TCPSocket maintient la perte de connexion
Question
J'ai un client et un serveur. Je commence le serveur et exécuter le client, et la première fois il fonctionne très bien. La deuxième fois que je lance le client (sans redémarrer le serveur), le client semble se bloquer. Quelqu'un peut-il voir ce qui ne va pas?
J'ai un client:
# 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
serveur:
# 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")
La solution
Chaque connexion au serveur nécessite une acceptation d'appel séparé pour être reçu. Ce qui se passe est que vous acceptez la première, de travailler avec elle, puis terminer efficacement tout en laissant la prise dans un état d'écoute. Cela signifie que les connexions seront ouvertes, mais pas accepté, ils pendent que vous décrivez.
Vous pourriez être mieux d'utiliser un cadre de serveur plus robuste. Eventmachine ( http://rubyeventmachine.com/ ) est un peu difficile à apprendre, mais est beaucoup plus puissant qu'un rouler votre propre solution.
Voici une solution rapide qui pourrait aider:
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
Maintenant, l'appel VALIDER est enveloppé dans une boucle si plus d'une connexion peut être traitée.