Question

Je crée un serveur Ruby qui se connecte à un client TCP. Mon serveur utilise un TCPServer et je tente d'utiliser TCPServer de la recv (), mais il n'attend pas des données, continue donc juste une boucle serrée jusqu'à ce que des données sont reçues.

Quelle est la manière la plus efficace pour traiter les données intermittant? Je suis incapable de changer les données envoyées dans depuis que je suis tenté d'imiter un autre serveur. Qui se lisent comme déclaration de TCPServer / TCPSocket attendrait les données envoyées?


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

Merci pour votre temps.

Était-ce utile?

La solution

Êtes-vous sûr recv ne revient pas « » - ce qui signifie la prise est fermée? Sinon alors peut-être vos prises sont mis à blocage non en quelque sorte?

eventmachine est en effet beaucoup plus rapide que l'utilisation de threads pour la programmation socket :) GL. -r

Autres conseils

Sur la base des questions que vous avez demandé, je pense que vous devriez essayer un cadre comme eventmachine et écrire un serveur qui implémente ce que vous voulez au lieu d'essayer d'embêter autour d'écrire un wrapper de serveur.

Cela étant dit, la façon la plus efficace de lire à partir d'une prise est d'utiliser un appel de sélection approprié et interroger toutes les connexions ouvertes. Bien que ce soit une chose assez académique pour quelqu'un qui a développé des applications client-serveur avant, il est une nuisance, car il y a beaucoup de choses que vous pouvez facilement se tromper. Par exemple. gérer plusieurs connexions peut conduire à toutes sortes de situations gênantes si vous n'êtes pas particulièrement prudent pour éviter les appels de blocage.

Le cadre de eventmachine le rend facile de développer des serveurs de type réponse à une interrogation / parce que vous pouvez toujours commencer par un modèle et le travail à partir de là, par exemple, le haut-eventmachine :: Protocoles :: LineAndTextProtocol on travaille comme une grande base pour la plupart.

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