0

私がやりたいことは、1025+ のすべてのポートで次のスクリプトを実行することです。私が行っているのは、オンライン ゲーム用にこのスクリプトとやり取りする Blackjack iPhone アプリを作成することです。問題は、すべてのポートを毎回リッスンするようにポートを変更して、これを各ポートに手動で配置したいということです。すべてのポートに新しいテーブルがあるようにするにはどうすればよいですか。各テーブルには、アプリがチェックする ID があり、プレーヤーの数とテーブルにいる人を確認します。

ソケットは Table クラスの ID を設定しますが、そのテーブルを維持し、すべてのプレーヤーの動きなどを保存できるようにするには、複数のポートに接続する必要があります。

要するに、このスクリプトをすべてのポートで実行するにはどうすればよいですか? また、リスニング ポートを単独で変更するにはどうすればよいでしょうか? また、各ポートで Python にすべてのテーブルを単独で作成させるにはどうすればよいでしょうか?

class Table:
    def __init__(self, id):
        self.players = []
        self.positions = {'1': '', '2': '', '3': '', '4': ''}

    def sit(self, player_id, position):
        self.positions[position] = player_id

# --------------------------------------------- #
# --------------------------------------------- #


class Socket(Protocol):
    def connectionMade(self):
        #self.transport.write("""connected""")
        self.factory.clients.append(self)
        print "Clients are ", self.factory.clients

    def connectionLost(self, reason):
        self.factory.clients.remove(self)

    def dataReceived(self, data):
        #print "data is ", data
        a = data.split(':')
        if len(a) > 1:
            command = a[0]
            content = a[1]



            msg = ""

        print msg

        for c in self.factory.clients:
            c.message(msg)

    def message(self, message):
        self.transport.write(message)


factory = Factory()
factory.protocol = Socket
factory.clients = []

reactor.listenTCP(1025, factory)
print "Blackjack server started"
reactor.run()
4

1 に答える 1

1

あなたの質問に答える

あなたが尋ねる:

  • このスクリプトをすべてのポートで実行するにはどうすればよいですか?
  • リスニングポートを単独で変更するにはどうすればよいですか?
  • Pythonに各ポートですべてのテーブルを単独で作成させるにはどうすればよいですか?

ここでの答えは、ループを使用してファクトリを必要な数のポートにバインドすることだと思います。ただし、ファクトリにもクライアントのリストを保存しているため、リーチポート用の新しいファクトリも作成する必要があります。だから次のようなもの:

factories = [ ]
for i in range(0, NUM_TABLES):
    factory = Factory()
    factory.protocol = Socket()
    factory.clicents = []
    factories.append(factory)
    reactor.listenTCP(1025 + i, factory)
    reactor.run()

クラスを使用しているため、各ファクトリは独自のクライアントリストを保持し、各ファクトリには接続を管理するための独自のSocketインスタンスがあります。インスタンスがどのようにインスタンス化されるかは示していませんTableが、各SocketまたはFactoryインスタンスがインスタンス化され、への参照を維持している限り、Tableそれぞれが独自の状態を持つ複数の接続を持つことができます。

すべてのファクトリのリストを保持することで、それらを繰り返し処理して、実行中のゲームなどのリストを作成できます。

別のアーキテクチャを検討する

上記は機能するかもしれませんが、クライアントサーバーシステムが通常どのように設計されているかではありません。特に、ここでのシステムでは、クライアントが使用するポートを知っている必要があります。これは、全員が一緒に居間にいるときにその場限りで機能する可能性がありますが、面倒であり、一般的には拡張できません。

必要なのは、Webサーバーのように、1つのポートでリッスンして接続を確立し、クライアントに「テーブルIDは25です。話したいときはいつでもそれを使用してください」と伝えるものです。さらに、これは、クライアントがテーブルのリストを利用できるようにして、クライアントが1つを選択できるようにすることを意味します。そして、そこからさらに凝ったものを手に入れることができます。クライアントに与えられた特別な期限切れのCookieは、ゲームの一部ではなくなったゲームを誤ってハッキング/妨害しないようにするためなどです。

于 2012-05-13T06:08:27.877 に答える