2010-03-22 4 views
0

Bonjour à tous, J'ai besoin d'implémenter un serveur TCP en Python qui reçoit des données d'un client puis envoie ces données à un autre client. J'ai essayé de nombreuses implémentations différentes, mais aucun moyen de le faire fonctionner. Toute aide sera grandement appréciée.
Ci-dessous mon code:Comment implémenter un hub en Python

import SocketServer 
import sys 
import threading 

buffer_size = 8182 
ports = {'toserver': int(sys.argv[1]), 'fromserver': int(sys.argv[2])} 

class ConnectionHandler(SocketServer.BaseRequestHandler): 

    def handle(self): 
     # I need to send the data received from the client connected to port 'toserver' 
     # to the client connected to port 'fromserver' - see variable 'ports' above 

class TwoWayConnectionServer(threading.Thread): 

    def __init__(self): 
     self.to_server = SocketServer.ThreadingTCPServer(("", ports['toserver']), ConnectionHandler) 
     self.from_server = SocketServer.ThreadingTCPServer(("", ports['fromserver']), ConnectionHandler) 
     threading.Thread.__init__(self) 

    def run(self): 
     while (1): 
      self.to_server.handle_request() 
      self.from_server.handle_request() 

def serve_non_blocking(): 

    server = TwoWayConnectionServer() 
    server.run() 

if __name__ == '__main__': 

    serve_non_blocking() 
+1

Vous devez être plus précis. Que voulez-vous dire "le faire fonctionner"? Tu ne pourrais pas commencer le programme? – unwind

Répondre

0

Pouvez-vous être plus précis sur ce que vous avez essayé et ce qui ne fonctionne pas? Il y a plusieurs manières de faire ça. Probablement le plus simple serait d'utiliser la bibliothèque socket - à la recherche peut-être quelques exemples aideront:

http://docs.python.org/library/socket.html#example

+0

Voir le code que j'ai ajouté à ma question ... – j3d

1

Voir la Twisted tutorial, et aussi twisted.protocols.portforward. Je pense que le module portforward fait quelque chose de légèrement différent de ce que vous voulez, il ouvre une connexion sortante au port de destination plutôt que d'attendre que le deuxième client se connecte, mais vous devriez pouvoir travailler à partir de là.

+0

J'ai ajouté du code à ma question (voir ci-dessus). Par exemple, est-il possible de recevoir des données d'un client (port 'toserver') et de les transférer directement à un autre client (port 'fromserfver')? Ou est-il nécessaire de mettre les données entrantes en tampon et de les envoyer au client cible dès que le client cible envoie un message demandant ces données? Merci, Jeff – j3d

+0

Je suppose que vous voudrez peut-être tamponner s'il n'y a rien de 'from_server' au début, mais sinon votre gestionnaire sur' to_server' peut simplement ressembler 'def dataReceived (self, data): from_server.write (data)' . – keturn

Questions connexes