2010-11-22 2 views
1

Je modifie la méthode buildProtocol de la ServerFactory, fondamentalement l'usine écoute sur les ports 11000 et 12000, et j'ai deux protocoles, un pour le port de chaque port. J'essaie de récupérer le port utilisé par le client pour pouvoir instancier le bon protocole.récupérer le port d'écoute pendant buildProtocol

ex. le client écoute au port 11000, le protocole 1 est instancié. le client écoute au port 12000, le protocole 2 est instancié.

Je pense que cela ne peut être fait que dans l'étape buildProtocol, est-il un moyen de déterminer quel port a été utilisé pour se connecter? le paramètre d'adresse utilisé par buildProtocol est l'adresse du client, j'ai besoin du port du serveur.

code pseudo:

def buildProtocol(self, address): 
    if address connects at port 11000: 
    proto = TransformProtocol() 
    else: 
    proto = TransformProtocol2() 
    proto.factory = self 
    return proto 
+0

Un petit exemple serait utile car il est difficile de visualiser votre problème. C'est aussi un peu déroutant quand vous dites "ex client écoute au port 11000 ..." Voulez-vous dire le serveur (en général, les serveurs font l'écoute)? – Gerrat

+0

hey gerrat, oui le serveur écoute à 11000 et 12000. ce que je voudrais faire est d'avoir des protocoles distincts pour chaque port. par exemple, protocole1 sur le port 11000 va mettre en majuscule tout le texte que le client envoie, tandis que le protocole2 sur le port 12000 transformera tout le texte que le client envoie en minuscules .. donc il y a une instance de fabrique, mais deux protocoles différents les deux ports. – momo

+0

Les protocoles sont complètement indépendants des ports. Vous devez sous-classer votre Usine pour avoir deux classes avec des fonctionnalités différentes. Puis les lier aux ports comme vous le souhaitez. –

Répondre

0

Je pense, vous pouvez avoir besoin d'utiliser les services Twisted: link text

code Vous devenir quelque chose comme:

from twisted.application import internet, service 
from twisted.internet import protocol, reactor 
from twisted.protocols import basic 

class UpperCaseProtocol(basic.LineReceiver): 
    def lineReceived(self, line): 
     self.transport.write(line.upper() + '\r\n') 
     self.transport.loseConnection() 

class LowerCaseProtocol(basic.LineReceiver): 
    def lineReceived(self, line): 
     self.transport.write(line.lower() + '\r\n') 
     self.transport.loseConnection() 

class LineCaseService(service.Service): 

    def getFactory(self, p): 
     f = protocol.ServerFactory() 
     f.protocol = p 
     return f 

application = service.Application('LineCase') 
f = LineCaseService() 

serviceCollection = service.IServiceCollection(application) 
internet.TCPServer(11000,f.getFactory(UpperCaseProtocol)).setServiceParent(serviceCollection) 
internet.TCPServer(12000,f.getFactory(LowerCaseProtocol)).setServiceParent(serviceCollection) 

Mais, ici, nous avons deux instances d'usine.

+0

anatoly, numéro d'exercice 3: http://krondo.com/?p=2101 – momo

+0

Krondo introduction à la programmation asynchrone est géniale, mais je pense que ma solution est plus claire et plus Twisted. Le protocole est l'endroit approprié pour la manipulation de données spécifiques à la logique (supérieure, inférieure). Une fabrique est l'emplacement approprié pour les données que vous souhaitez mettre à la disposition des instances de protocole, car les instances de protocole sont collectées lors de la fermeture de la connexion. Essayez d'exécuter cet exemple: twistd -y server.tac (le nom du fichier exemple), telnet localhost 11000 –

+0

Vous pouvez également lire le didacticiel Twisted "Twisted From Scratch": http://twistedmatrix.com/documents/current/core /howto/tutorial/index.html –

Questions connexes