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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top