2 votes

Ruby tcpserver client serveur

J'ai une application que je suis en train de coder pour que les informations d'enregistrement soient envoyées par tcpsocket à un serveur et qu'un client de surveillance se connecte au serveur pour voir les données d'enregistrement. Jusqu'à présent, j'ai réussi à atteindre le stade où l'information est envoyée au serveur, mais j'ai besoin de quelques idées sur la façon de procéder à l'étape suivante. En utilisant Ruby tcpsever, quelles méthodologies puis-je utiliser pour que le serveur renvoie les données entrantes à un client ? Comment puis-je avoir des données stockées à travers les threads ?

require "socket"  

server_socket = TCPServer.new('localhost', 2200)  

loop do  
  # Create a new thread for each connection.
  Thread.start(server_socket.accept) do |session|

    # check if received is viewer request
    line = session.gets
    if line =~ /viewer/
      @filter = line[/\:(.*?)\:/]
      session.puts "Listining for #{filter}"

      loop do
        if (log = ### need input here from logging app ###)
          # Show if filter is set for all or cli matches to filter
          if @filter == ':all:' || log =~ /\:(.*?)\:/
            session.puts log
          end

          # Read trace_viewer input. 
          if session.gets =~ /quit/
            # close the connections
            session.puts "Closing connection. Bye!"
            session.close
            break
          end
        end
      end
    end
  end  
end

0voto

the Tin Man Points 69148

La connexion des clients au serveur ressemble à une configuration client/serveur typique, certains clients envoyant des données, d'autres les demandant. Y a-t-il une raison pour laquelle vous n'utilisez pas un client/serveur HTTP standard, c'est-à-dire un serveur Web, au lieu de réinventer la roue ? Utilisez Sinatra ou Padrino, ou même Rails, et vous aurez pratiquement terminé.

Comment puis-je avoir des données stockées dans plusieurs threads ?

Le module Thread de Ruby comprend Queue ce qui permet de déplacer les données entre les threads. La page du document contient un exemple qui devrait vous aider.

Les mêmes idées pour l'utilisation d'une file d'attente s'appliquent à l'utilisation de tableaux. Je recommanderais d'utiliser une base de données pour faire office de file d'attente pour votre utilisation, plutôt que de le faire en mémoire. Une panne de courant, ou un crash de l'application perdront toutes les données s'il s'agit d'une file d'attente en mémoire et que les clients n'ont pas tout récupéré. L'écriture et la lecture d'une base de données permettent aux données de survivre à de tels problèmes.

Gardez le schéma simple, fournissez un index raisonnable sur celui-ci, et il devrait être assez rapide pour la plupart des utilisations. Vous aurez besoin d'un peu de code pour garder la base de données propre, mais c'est facile en utilisant SQL, ou un ORM comme Sequel ou ActiveRecord.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X