я следующий код (почти точная копия примера чат-сервера в списке 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 работали с этим приложением.
Еще раз спасибо.
А я думал, что вы проверили с помощью wirehark и что клиенты MUD используют паузу или что-то еще в качестве разделителя. Ну, это чистое решение: D –
В принципе вы не можете делать никаких предположений о том, отправит ли клиент \ n, \ r, \ n \ r или \ r \ n. Лично я не стал бы изгибать LineReceiver, чтобы обрабатывать Telnet (и особенно не MUD-трафик), потому что это не принципиально линейный протокол, особенно если вы рассматриваете последовательности IAC, цвет ANSI и т. Д. – Kylotan
Какие Twisted компоненты вы предложите использовать? –