1

ツイストしたリッスン 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)
4

0 に答える 0