2009-09-21 3 views
0

J'ai un client et un serveur. Je démarre le serveur et exécute le client, et la première fois cela 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?Ruby TCPSocket continue à perdre la connexion

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 
 

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

Répondre

2

Chaque connexion au serveur nécessite une acceptation d'appel séparé pour être reçu. Qu'est-ce qui se passe, c'est que vous acceptez le premier, de travailler avec elle, puis de terminer effectivement tout en laissant la prise dans un état d'écoute. Cela signifie que les connexions seront ouvertes, mais pas acceptées, alors elles se bloqueront comme vous le décrivez.

Il vaudrait peut-être mieux utiliser une infrastructure de serveur plus robuste. EventMachine (http://rubyeventmachine.com/) est un peu difficile à apprendre, mais il est beaucoup plus puissant qu'un rouleau de 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.

Questions connexes