3

Twistedを使用してカスタムプロトコルでサーバーを作成し、特定のポート(ポート1234など)でサーバーに接続するクライアントがあります。ある種のWebページに基づいてサーバーの制御インターフェースを作成しようとしています。これまでの私の調査では、Nevowが人気のある選択肢であることが示されていますが、必要なのは非常に単純なものだけです。

たとえば、ブラウザがポート8080でhello worldページにアクセスするたびに、1234で接続されているクライアントにメッセージを送信するとします。

これら2つをどのように接続できるかについて少し混乱しています。HelloResource.render_GETからServer.messageを呼び出す必要があると思いますか?

from twisted.internet import protocol, reactor
from twisted.web.resource import Resource

    class Server(protocol.Protocol):
        def dataReceived(self, data):
            #do something on the server side

        def message(self)
            #send message to clients

    class HelloResource(Resource):
        isLeaf = True

        def render_GET(self,request):
            return "<html>Hello, world!</html>"

factory = protocol.Factory()
factory.protocol = Server
reactor.listenTCP(1234, factory)

reactor.listenTCP(8080, server.Site(HelloResource()))

reactor.run()
4

2 に答える 2

5

これは、TwistedFAQで回答された質問と非常によく似ています。

基本的に、ファクトリによって作成されたプロトコルインスタンスを、Webサーバーを構成するリソースにアクセスできるようにする必要があります。

これを行う簡単な方法は、ファクトリにプロトコルインスタンスのリストを保持させ(buildProtocolまだ読んでいない場合は読んでください)、ファクトリインスタンスをHelloResourceイニシャライザに渡し、そのイニシャライザにファクトリをHelloResourceインスタンスの属性として保存させることです。 。

これHelloResourceにより、プロトコルインスタンスのリストにアクセスします(ファクトリオブジェクトを介して、現在は参照先になっています)。これを繰り返し処理して、たとえば、各プロトコルインスタンスのメソッドを呼び出すことができます。

于 2013-02-28T22:53:12.713 に答える
1

この方法で物事を実行したい場合は、Server.message明らかにである必要があり@classmethod、クライアントのリストにアクセスして、各クライアントにメッセージを送信する必要があります。

このようなもの:

class Server(protocol.Protocol):
    clients = set()

    def dataReceived(self, data):
        #do something on the server side
        pass

    def connectionMade(self):
        Server.clients.add(self)

    def connectionLost(self):
        Server.clients.remove(self)

    @classmethod
    def message(cls):
        for client in cls.clients:
            client.transport.write('got GET request\n')

Server.message()これで、メソッドから呼び出すことができますrender_GET

これが最適な設計であるかどうかはわかりませんが、実際には、プロトコルクラスよりもクライアントのリストをハングアップするためのあらゆる種類の優れたオブジェクトがありますが、機能するはずです。

于 2013-02-28T23:03:56.423 に答える