2010-06-09 10 views
1

Je suis en train de faire un serveur TCP simple à l'aide Twisted, qui peut faire une interaction entre le client diffirent connexions.Le code principal est comme ci-dessous:Problème avec le serveur TCP dans Twisted

#!/usr/bin/env python 
from twisted.internet import protocol, reactor 
from time import ctime 

#global variables 
PORT = 22334 
connlist = {} #store all the connections 
ids = {} #map the from-to relationships 

class TSServerProtocol(protocol.Protocol): 

    def dataReceived(self, data): 
     from_id,to_id = data.split('|') #get the IDs from standard client input,which looks like "from_id|to_id" 

     if self.haveConn(from_id): #try to store new connections' informations 
      pass 
     else: 
      self.setConn(from_id) 
      self.setIds(from_id,to_id) 

     if to_id in self.csids.keys():     
      self.connlist[to_id].transport.write(\ 
      "you get a message now!from %s \n" % from_id) #if the to_id target found,push him a message.doesn't work as expected 
    def setConn(self,sid): 
     connlist[sid] = self 

    #some other functions 

factory = protocol.Factory() 
factory.protocol = TSServerProtocol 
print 'waiting from connetction...' 
reactor.listenTCP(PORT, factory) 
reactor.run() 

Comme les commentaires mentionnés , si une nouvelle connexion client vient, je vais stocker sa poignée de connexion dans un varaible global connlist qui est comme

connlist = {a_from_id:a_conObj,b_from_id:b_conObj,....} 

et parse également l'entrée carte alors son de à l'information dans ids .Ensuite Je vérifie s'il y a une clé dans le ids correspond à "to_id" .if actuel, obtenir le handle de connexion en utilisant connlist[to_id] et pousser un message à la connexion cible.Mais ça ne fonctionne pas.Le message ne montre que dans une même connexion.Espoir quelqu'un peut me montrer quelques directions à ce sujet .

Merci!

+1

Votre fonction 'dataReceived' fait référence à un' self.connlist' local, pas au global. N'utilisez pas de globaux. Vous voudrez peut-être stocker la liste des connexions sur l'instance de l'usine et y accéder à partir d'une instance de protocole via 'self.factory.connlist' – MattH

+0

@ MattH, merci pour la note. Pourriez-vous me dire quel objet dois-je stocker dans' connlist' si je fais cela en usine? – Young

+0

Ce serait génial si vous pouviez trouver un meilleur titre pour cette question, quelque chose qui pointe un peu plus précisément ce que vous essayez de demander. D'autres personnes ont également des questions similaires, ce qui les aiderait à le trouver lors de la recherche. Beaucoup trop de questions SO Twisted sont intitulées juste "problème avec Twisted" ou "Twisted cassé, besoin d'aide" ou "aide avec Twisted", et cetera. – Glyph

Répondre

3

Chaque fois qu'une connexion TCP est établie, Twisted crée une instance unique de TSServerProtocol pour gérer cette connexion. Ainsi, vous verrez seulement 1 connexion dans TSServerProtocol. Normalement, c'est ce que vous voulez mais les usines peuvent être étendues pour faire le suivi de la connexion que vous essayez de faire ici. Plus précisément, vous pouvez sous-classer Factory et remplacer la méthode buildProtocol() pour suivre les instances de TSServerProtocol. L'interrelation entre toutes les classes de Twisted prend un peu de temps pour apprendre et s'habituer. En particulier, cette partie du standard Twisted documentation devrait être votre meilleur ami pour la prochaine fois ;-)

+0

Merci pour une belle suggestion.J'essaie de le gérer mieux :) – Young