У меня работает витой реактор, как мне к нему подключиться? - PullRequest
1 голос
/ 05 декабря 2011

Я следовал инструкциям и теперь у меня работает витой реактор. Я использовал telnet для проверки того, что он работает, но мне не удалось найти что-либо в запутанных руководствах по подключению к реактору.

Мое предположение, что что-то будет в витрине для этого, стоит ли мне вместо этого использовать встроенный сокет?

Edit:

Это серверный скрипт:

import time
import multiprocessing

from twisted.internet.protocol import Factory
from twisted.protocols.basic import LineReceiver
from twisted.internet import reactor

class TTT(LineReceiver):
    def __init__(self, users):
        self.users = users
        self.name = None
        self.state = "GETNAME"

    def connectionMade(self):
        self.sendLine("You are connected")

    def connectionLost(self, reason):
        if self.users.has_key(self.name):
            del self.users[self.name]

    def lineReceived(self, line):
        if line == "quit":
            reactor.stop()

        if self.state == "GETNAME":
            self.handle_GETNAME(line)
        else:
            self.handle_CHAT(line)

    def handle_GETNAME(self, name):
        if self.users.has_key(name):
            self.sendLine("Name taken, please choose another.")
            return
        self.sendLine("Welcome, %s!" % (name,))
        self.name = name
        self.users[name] = self
        self.state = "CHAT"

    def handle_CHAT(self, message):
        message = "<%s> %s" % (self.name, message)
        for name, protocol in self.users.iteritems():
            if protocol != self:
                protocol.sendLine(message)


class TTTFactory(Factory):
    def __init__(self):
        self.state = [0 for x in range(9)]
        self.turn = -1

        self.users = {} # maps user names to Chat instances

    def make_move(self, player, x, y):
        if player != self.turn:
            return "Not your turn"

        i = x + y * 3

        if self.state[i] != 0:
            return "Invalid move"

        self.state[i] = player

        # Horrizontal
        if self.state[0] == self.state[1] == self.state[2]: return "Win"
        if self.state[3] == self.state[4] == self.state[5]: return "Win"
        if self.state[6] == self.state[7] == self.state[8]: return "Win"

        # Vertical
        if self.state[0] == self.state[3] == self.state[6]: return "Win"
        if self.state[1] == self.state[4] == self.state[7]: return "Win"
        if self.state[2] == self.state[5] == self.state[8]: return "Win"

        # Diagonal
        if self.state[0] == self.state[4] == self.state[8]: return "Win"
        if self.state[6] == self.state[4] == self.state[2]: return "Win"

        # Swap turn
        self.turn = 0 - self.turn
        return "Next move"

    def buildProtocol(self, addr):
        return TTT(self.users)

# def reactor_runner():
def new_server(conn):
    port_num = 8007
    conn.send(port_num)

    reactor.listenTCP(port_num, TTTFactory())
    reactor.run()

Я хочу, чтобы другая программа / процесс python отправляла и получала сообщения от него. Идея проекта заключается в создании многопользовательской игры в крестики-нолики.

Я хочу иметь серверный процесс и 1 или более клиентских процессов. Для простоты запуска в настоящее время я использую многопроцессорность для их одновременного запуска. По завершении клиентский процесс должен иметь возможность подключаться по сети, поскольку он может не находиться на том же компьютере, что и хост.

1 Ответ

3 голосов
/ 05 декабря 2011

Ниже приведен небольшой пример клиента, способного подключаться к вашему серверу.

from twisted.internet.protocol import ClientFactory
from twisted.protocols.basic import LineReceiver
from twisted.internet import reactor

class TTTClientProtocol(LineReceiver):
    def lineReceived(self, line):
        line = line.strip()
        if line == 'You are connected':
            self.sendLine(self.factory.username)
        else:
            print 'SERVER SAYS:', line

class TTTClientFactory(ClientFactory):
    protocol = TTTClientProtocol 

    def __init__(self, name):
        self.username = name


name = raw_input('Please enter your name: ')
print 'Connecting...'

reactor.connectTCP('localhost', 8007, TTTClientFactory(name))

reactor.run()

Я держал это настолько просто, насколько мог, чтобы вы могли легко понять это, но для реализации части чата мне понадобится код для чтения из stdin без блокировки реактора. Поскольку вы упомянули, что вместо стандартного ввода / вывода терминала используется графический интерфейс пользователя, на самом деле это намного проще - просто выберите реактор, совместимый с вашей библиотекой GUI , а затем используйте обычные события GUI.

Надеюсь, это поможет ...

...