ツイストしたリッスン tcp クライアントで実行されている TCP サーバーがあります。また、Twisted サーバーの AMP を介して TCP クライアントにメッセージを送信する Django アプリもあります。
Djsngo アプリから送信された注文は、TCP クライアントの応答を待つ AMP 応答を待ちます。
私の問題は、送信された複数の注文に関するものです。遅延メッセージとしての AMP サーバーは、壊れた TCP クライアント接続でメッセージをクロスする可能性があります。この請求接続を解決するために、この注文をプールまたは他の方法として管理する方法が必要です。
私のAMPサーバーは
"""Amp Server """
from twisted.protocols.amp import AMP, Command, String
class AmpProcessor(Command):
arguments = [('proto', String()),
('imei', String()),
('ip', String()),
('port', String()),
('cmmd', String()),
('mssg', String())]
response = [('answer', String())]
class AMPServer(AMP):
@AmpProcessor.responder
def processor(self, proto, imei, ip, port, cmmd, mssg):
try:
response = self.factories[proto].clients[ip].runCommand(cmmd, mssg)
return {'answer': str(response)}
except:
return {'answer': str('FAIL')}
私のサーバーが行うことは、接続が受信されると、取得されるパラメーターは
- Proto: ハードウェア TCP クライアントのインデックスが保存されました
- Imei: クライアント識別子
- Ip: クライアント接続 IP
- ポート: ポート接続
- Cmmd: オーダー、実行されるメソッドです
- Mssg: クライアントに送信されるメッセージ
接続が受信されると、AMP はクライアント接続が格納されている配列をチェックし、注文を送信するためにインスタンスを使用します。
次に、クライアント接続がクラッシュしないためのプールのような管理接続を探しています
私のTCPサーバー
from twisted.internet import threads
from twisted.internet.protocol import Factory, Protocol
class TrackerServer(Protocol):
"""Tracker Twisted Protocol Class."""
def __init__(self, clients, devicer):
self.clients = clients
self.devicer = devicer
self.decoder = None
self.host = None
self.peer = None
self.state = False
def connectionMade(self):
"""ConnectionMade Twisted event."""
try:
decoderModule = __import__('listener.protocols.%sDecoder' % (self.devicer, ), fromlist=['%sDecoder' % (self.devicer, )])
decoderClass = getattr(decoderModule, '%sDecoder' % (self.devicer, ))
self.decoder = decoderClass()
self.peer = self.transport.getPeer()
self.host = self.transport.getHost()
self.decoder.openConnection(self.host.host, self.host.port, self.peer.host, self.peer.port)
print 'Connection made to', self.host, 'from', self.peer
self.clients[self.peer.host] = self
except ValueError:
print "Oops! Connection was not started"
def connectionLost(self, reason):
"""ConnectionLost Twisted event."""
if self.clients.has_key(self.peer.host):
del self.clients[self.peer.host]
self.decoder.closeConnection()
print "Connection lost from", self.peer.host, ':', reason
else:
print "Connection unknown peer:", reason
def dataReceived(self, data):
"""DataReceived Twisted event."""
#try:
""" how to precess here a line for a specific client"""
response = self.decoder.processDatagram(data)
if response != False:
self.sendMessage(response)
#d = threads.deferToThread(self.factory.decoder.processDatagram(data ))
#d.addCallback(self.sendResponse)
#except ValueError:
# print "Oops! That was no valid data. Try again..."
def sendMessage (self, response):
self.transport.write(response)
class TrackerFactory(Factory):
def __init__(self, devicer):
self.clients = {}
self.devicer = devicer
def buildProtocol(self, addr):
proto = TrackerServer(self.clients, self.devicer)
self.connectedProtocol = proto
return proto
私の *.tac ファイル
import os, sys
import ConfigParser
from twisted.application import internet, service
from twisted.internet import protocol, reactor
from listener.TrackerServer import TrackerFactory
from listener.AMPServer import AMPServer
from twisted.internet.protocol import Factory
from twisted.internet.endpoints import TCP4ServerEndpoint
from twisted.application.internet import StreamServerEndpointService
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")
factories = {}
for device in config.get('protocols', 'keys').split(','):
devicer = config.get(device, 'name')
factories[devicer] = TrackerFactory(devicer)
internet.TCPServer(int(config.get(device, 'port')), factories[devicer]).setServiceParent(application)
endpoint = TCP4ServerEndpoint(reactor, 8750)
factory = Factory()
factory.protocol = AMPServer
factory.protocol.factories = factories
ampService = StreamServerEndpointService(endpoint, factory)
ampService.setServiceParent(application)