2009-12-14 3 views
2

я следующий код (почти точная копия примера чат-сервера в списке here:Скрученные игнорирование данных, отправленных от клиентов MUD?

импорт twisted.scripts.twistd из twisted.protocols импорта основной из протокола twisted.internet импорта, реактор из витых. обслуживание импорта приложений, интернет

class MyChat(basic.LineReceiver): 
    def connectionMade(self): 
     print "Got new client!" 
     self.factory.clients.append(self) 

    def connectionLost(self, reason): 
     print "Lost a client!" 
     self.factory.clients.remove(self) 

    def lineReceived(self, line): 
     print "received", repr(line) 
     for c in self.factory.clients: 
      c.message(line) 

    def message(self, message): 
     self.transport.write(message + '\n') 

factory = protocol.ServerFactory() 
factory.protocol = MyChat 
factory.clients = [] 

if __name__ == "__main__": 
    print "Building reactor...." 
    reactor.listenTCP(50000, factory) 
    print "Running ractor...." 
    reactor.run() 
else: 
    application = service.Application("chatserver") 
    internet.TCPServer(50000, factory).setServiceParent(application) 

сервер работает без ошибок, и если подключить к нему через Telnet, я могу отправить данные и отпечатки сервера на консоли и передает его всем клиентам (как ожидается). Однако, если я подключусь к нему с помощью другого инструмента (клиента MUD), он никогда не будет ts данные.

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

Я пробовал это с двумя клиентами MUD, gmud и JMC. Если это важно, я запускаю Windows 7 x64.

Кто-нибудь знает, почему это может произойти?

Спасибо,

Майк

EDIT:

Благодаря подсказкам, предоставленных Maiku Mori, я попытался добавить еще один метод, который был указан в Twisted API Docs, DataReceived. Как только это было добавлено, клиенты MUD работали отлично, но Telnet теперь отправляет каждый символ, как собственный набор данных, вместо того, чтобы ждать, пока пользователь нажмет Enter.

Вот отрезала нового кода:

def dataReceived(self, data): 
     print "Dreceived", repr(data) 
     for c in self.factory.clients: 
      c.message(data) 

# def lineReceived(self, line): 
#  print "received", repr(line) 
#  for c in self.factory.clients: 
#   c.message(line) 

Кто-нибудь испытывает это раньше, и если да, то каким образом вы получаете вокруг него? В идеале я бы хотел, чтобы клиенты Telnet и MUD работали с этим приложением.

Еще раз спасибо.

ответ

3

В случае, если кто-либо столкнется с этим вопросом с аналогичными проблемами, я оставляю свои выводы в качестве принятого ответа, чтобы люди не могли охотиться так, как я.

Я исправил проблему, изменив значение разделителя в моем витой протоколе с «\ r \ n» (по умолчанию), до «\ n» (это то, что посылают мои клиенты MUD.Это означает, что в Telnet, когда вы вводите строку:

Hello, World 

Ваше приложение будет получать его как:

Hello, World\r 

Вам может понадобиться сделать санобработку данных на стороне сервера, чтобы держать вещи в порядке. Мой окончательный код следующим образом:

импорт twisted.scripts.twistd из twisted.protocols импорта основной из протокола twisted.internet импорта, реактор из twisted.application импорта услуг, интернет

class MyChat(basic.LineReceiver): 
    def __init__(self): 
     self.delimiter = "\n" 

    def connectionMade(self): 
     print "Got new client!" 
     self.factory.clients.append(self) 

    def connectionLost(self, reason): 
     print "Lost a client!" 
     self.factory.clients.remove(self) 

    def lineReceived(self, line): 
     print "received", repr(line) 
     for c in self.factory.clients: 
      c.message(line) 

    def message(self, message): 
     self.transport.write(message + '\n') 

factory = protocol.ServerFactory() 
factory.protocol = MyChat 
factory.clients = [] 

if __name__ == "__main__": 
    print "Building reactor...." 
    reactor.listenTCP(50000, factory) 
    print "Running ractor...." 
    reactor.run() 
else: 
    application = service.Application("chatserver") 
    internet.TCPServer(50000, factory).setServiceParent(application) 

Спасибо за всякую помощь.

+0

А я думал, что вы проверили с помощью wirehark и что клиенты MUD используют паузу или что-то еще в качестве разделителя. Ну, это чистое решение: D –

+0

В принципе вы не можете делать никаких предположений о том, отправит ли клиент \ n, \ r, \ n \ r или \ r \ n. Лично я не стал бы изгибать LineReceiver, чтобы обрабатывать Telnet (и особенно не MUD-трафик), потому что это не принципиально линейный протокол, особенно если вы рассматриваете последовательности IAC, цвет ANSI и т. Д. – Kylotan

+0

Какие Twisted компоненты вы предложите использовать? –

1

Вы уверены, что клиенты MUD отправляют штриховые штрихи после каждой строки? lineReceived будет вызываться только после того, как был отправлен символ окончания строки.

EDIT:

Здесь я нашел API для документации LineReceiver. Вы можете поиграть с методом dataReceived, чтобы узнать, действительно ли вы получаете какие-либо данные. Если я помню, вы можете использовать его так же, как lineReceived.

+0

Я не уверен, что они или нет. Есть ли способ, которым я могу вручную добавить это к концу следующего, чтобы проверить его? –

+0

Хорошо, вы можете протестировать его с помощью Wireshark. Существуют и другие базовые классы получателя, которые вы могли бы использовать. Прошло некоторое время с тех пор, как я прочитал документы Twisted API, но я думаю, что есть еще один метод, который вызывается, как только куски данных появляются в прямом эфире, вы можете использовать это, чтобы увидеть, есть ли какие-либо данные. Но прошло уже почти год с тех пор, как я прочитал документы, поэтому я могу ошибаться. –

+0

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

Смежные вопросы