2013-05-03 80 views
1

我正与一个多端口的应用程序的工作,我的问题是关于我用,让我的代码扭曲的多个端口

这是我的TAC文件,在那里我阅读,我将使用哪个端口解释解码器从一个配置文件,这个配置文件有口部哪一个会倾听客户,也为接收到的数据解码器,用于〔实施例

[protocols] 
keys: vt310,gt06,al900c 

[al900c] 
name:AL900C 
port: 5010 

[vt310] 
name:VT310 
port: 5020 

[other] 
name:OTHER 
port: 5030 

,你可以看到,我开始用解码器告知将被搜索在配置文件上

import os, sys 
import ConfigParser 
from twisted.application import internet, service 
from twisted.internet import protocol 
from listener.TrackerServer import TrackerServer 

PROJECT_DIR = os.path.abspath(os.path.dirname(__file__)) 
sys.path.append(PROJECT_DIR) 

path = None 
config = ConfigParser.ConfigParser() 
config.read('protocols.cfg') 

application = service.Application("tracker") 
for device in config.get('protocols', 'keys').split(','): 
    factory = protocol.ServerFactory() 
    factory.clients = [] 
    factory.decoder = None 
    factory.protocol = TrackerServer 
    factory.devicer = config.get(device, 'name') 
    internet.TCPServer(int(config.get(device, 'port')), factory).setServiceParent(application) 

我的服务器,每次启动一个连接,服务器必须使用在工厂创建分配解码器,

from twisted.internet import threads 
from twisted.internet.protocol import Factory, Protocol 

class TrackerServer(Protocol): 
    """Tracker Twisted Protocol Class.""" 

    def connectionMade(self): 
     """ConnectionMade Twisted event.""" 
     try: 
      decoderModule = __import__('listener.protocols.%sDecoder' % (self.factory.devicer,), fromlist=['%sDecoder' % (self.factory.devicer,)]) 
      decoderClass = getattr(decoderModule, '%sDecoder' % (self.factory.devicer,)) 

      self.factory.decoder = decoderClass() 
      print 'Connection made to', self.transport.getHost(), 'from', self.transport.getPeer() 
      self.factory.clients.append(self) 
     except ValueError: 
      print "Oops! Connection was not started" 

    def connectionLost(self, reason): 
     """ConnectionLost Twisted event.""" 
     self.factory.clients.remove(self) 
     print "Connection lost ", reason 

    def dataReceived(self, data): 
     """DataReceived Twisted event.""" 
     #try: 
     """ how to precess here a line for a specific client""" 
     self.sendResponse(self.factory.decoder.processDatagram(data)) 
      #d = threads.deferToThread(self.factory.decoder.processDatagram(data)) 
      #d.addCallback(self.sendResponse) 
     #except ValueError: 
     # print "Oops! That was no valid data. Try again..." 

    def sendResponse (self, response): 
     self.transport.write(response) 

问题,至少我已经注意到了,一如既往,每次一开始时,如你所见,在这种情况下,最后一个解码器将被启动,总是使用gt06,我需要根据端口使用解码器,这是我的日志,你可以注意到,在2013年5月4日11: 29:56-0500,用于解码改变类

2013-05-08 09:09:05-0500 [TrackerServer,20,200.108.107.17] [03863077 @ GT06Decoder : Loging] 78780d01086471700386307700af40fe0d0a 
2013-05-08 09:09:07-0500 [TrackerServer,20,200.108.107.17] [03863077 @ GT06Decoder : Locating] lat: -16.4255433333, lng: -71.5245183333 
2013-05-08 09:09:09-0500 [TrackerServer,20,200.108.107.17] [03863077 @ GT06Decoder : Status] 78780a13440604000200b1085f0d0a 
2013-05-08 09:09:10-0500 [TrackerServer,20,200.108.107.17] [03863077 @ GT06Decoder : Locating] lat: -16.42506, lng: -71.5245766667 
2013-05-08 09:09:17-0500 [TrackerServer,20,200.108.107.17] [03863077 @ GT06Decoder : Locating] lat: -16.4262866667, lng: -71.5243683333 
2013-05-08 09:09:23-0500 [TrackerServer,20,200.108.107.17] [03863077 @ GT06Decoder : Locating] lat: -16.42436, lng: -71.5247866667 
2013-05-08 09:09:25-0500 [TrackerServer,20,200.108.107.17] [03863077 @ GT06Decoder : Locating] lat: -16.4249, lng: -71.5246266667 
2013-05-08 09:09:27-0500 [TrackerServer,20,200.108.107.17] [03863077 @ GT06Decoder : Locating] lat: -16.4271233333, lng: -71.524145 
2013-05-08 09:09:38-0500 [TrackerServer,20,200.108.107.17] [03863077 @ GT06Decoder : Locating] lat: -16.428455, lng: -71.5238933333 
2013-05-08 09:09:43-0500 [TrackerServer,1,190.113.208.135] [11742151 @ AL900CDecoder : Header is no valid] 2929b10007117421510caf0d 
2013-05-08 09:09:47-0500 [TrackerServer,20,200.108.107.17] [11742151 @ GT06Decoder : Locating] lat: -16.4291516667, lng: -71.5238566667 
2013-05-08 09:09:59-0500 [TrackerServer,20,200.108.107.17] [11742151 @ GT06Decoder : Locating] lat: -16.4293483333, lng: -71.5248666667 
2013-05-08 09:10:08-0500 [TrackerServer,20,200.108.107.17] [11742151 @ GT06Decoder : Locating] lat: -16.4294916667, lng: -71.525855 
2013-05-08 09:10:18-0500 [TrackerServer,20,200.108.107.17] [11742151 @ GT06Decoder : Locating] lat: -16.4296616667, lng: -71.526645 
2013-05-08 09:10:27-0500 [TrackerServer,20,200.108.107.17] [11742151 @ GT06Decoder : Locating] lat: -16.4297583333, lng: -71.5266416667 
2013-05-08 09:10:37-0500 [TrackerServer,20,200.108.107.17] [11742151 @ GT06Decoder : Locating] lat: -16.430435, lng: -71.5265033333 
2013-05-08 09:10:47-0500 [TrackerServer,20,200.108.107.17] [11742151 @ GT06Decoder : Locating] lat: -16.43122, lng: -71.5263833333 
2013-05-08 09:10:57-0500 [TrackerServer,20,200.108.107.17] [11742151 @ GT06Decoder : Locating] lat: -16.4317583333, lng: -71.52629 
2013-05-08 09:11:07-0500 [TrackerServer,20,200.108.107.17] [11742151 @ GT06Decoder : Locating] lat: -16.4323416667, lng: -71.5262116667 
2013-05-08 09:11:17-0500 [TrackerServer,20,200.108.107.17] [11742151 @ GT06Decoder : Locating] lat: -16.4328383333, lng: -71.5261283333 
2013-05-08 09:11:27-0500 [TrackerServer,20,200.108.107.17] [11742151 @ GT06Decoder : Locating] lat: -16.43324, lng: -71.526085 
2013-05-08 09:11:38-0500 [TrackerServer,20,200.108.107.17] [11742151 @ GT06Decoder : Locating] lat: -16.43384, lng: -71.5259933333 
2013-05-08 09:11:47-0500 [TrackerServer,20,200.108.107.17] [11742151 @ GT06Decoder : Locating] lat: -16.4342116667, lng: -71.5259316667 
2013-05-08 09:11:56-0500 [TrackerServer,21,200.108.107.17] [32045214 @ AL900CDecoder : Header is no valid] 2929b10007320452140cca0d 
2013-05-08 09:11:57-0500 [TrackerServer,20,200.108.107.17] [32045214 @ GT06Decoder : Locating] lat: -16.4349533333, lng: -71.52572 
2013-05-08 09:12:07-0500 [TrackerServer,20,200.108.107.17] [32045214 @ GT06Decoder : Locating] lat: -16.43544, lng: -71.5255333333 
2013-05-08 09:12:08-0500 [TrackerServer,20,200.108.107.17] [32045214 @ GT06Decoder : Status] 78780a13440604000200c71eee0d0a 
2013-05-08 09:12:17-0500 [TrackerServer,20,200.108.107.17] [32045214 @ GT06Decoder : Locating] lat: -16.43572, lng: -71.52553 
2013-05-08 09:12:18-0500 [TrackerServer,21,200.108.107.17] [32045214 @ AL900CDecoder : Header is no valid] 2929b10007320452140cca0d 
2013-05-08 09:12:27-0500 [TrackerServer,20,200.108.107.17] [32045214 @ GT06Decoder : Locating] lat: -16.4359733333, lng: -71.526235 

回答

3

您使用全局变量来指定哪些解码器服务器上的端口之一s使用:

factory = protocol.ServerFactory() 
factory.protocol = TrackerServer 
factory.protocol.decoder = deco 

由于全局只能有一个值,因此只能定义一个解码器。

此线之后:

factory.protocol = TrackerServer 

factory.protocol是指相同的对象TrackerServer指。所以程序有效地做到:

TrackerServer.decoder = deco 

在循环中。很清楚,那不会做你想做的事,对吧?

作为替代方法,请尝试在循环中使用factory.decoder = deco,并在协议实现中使用self.factory.decoder(以替换self.decoder)。

+0

我完成了你的建议并粘贴了代码和结果,并且它仍然存在相同的问题 – Carlos 2013-05-04 16:35:39

+0

JP我已经完成了建议的更改,但它仍然是交叉信息。如在线2013-05-08 09:09:38-0500,2013-05-08 09:09:43-0500,2013-05-08 09:09:47-0500中可以看到的那样,解码器正在交叉并且连接是nmnot变得独立 – Carlos 2013-05-08 14:16:56

+0

这个问题被引用到类attr和实例attr的基类和子类错误。朋友,谢谢 – Carlos 2013-05-08 18:15:18