Я пытаюсь создать простой TCP-сервер с использованием 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()
Как упоминалось в комментариях, если приходит новое клиентское соединение, я сохраню его дескриптор соединения в глобальной переменной connlist
, которая похожа на
connlist = {a_from_id:a_conObj,b_from_id:b_conObj,....}
а также проанализируйте ввод, затем сопоставьте его информацию от-до в ids
. Затем я проверяю, соответствует ли ключ в ids
текущему "to_id". Если это так, получаю дескриптор соединения с помощью connlist[to_id]
и отправляю сообщение на целевое соединение. Но это не работает. сообщение отображается только при том же соединении.
Спасибо!
dataReceived
функция ссылается на локальныйself.connlist
, а не на глобальный. Не используйте глобальные переменные. Вы можете сохранить список подключений в экземпляре фабрики и получить к нему доступ из экземпляра протокола черезself.factory.connlist
- person MattH   schedule 09.06.2010connlist
, если я сделаю это на заводе? - person Young   schedule 09.06.2010