使用简单的Twisted聊天服务器遇到麻烦 [英] Having trouble with a simple Twisted chat server

查看:137
本文介绍了使用简单的Twisted聊天服务器遇到麻烦的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我尝试运行此命令(请参见下面的代码)时,我从服务器和命令提示符处收到连接已建立"响应,以编写输入.但是,当我尝试输入输入内容时,它只是挂起,服务器似乎没有收到该消息.有人知道为什么吗?

When I try and run this (see code below) I get the "connection made" response from the server and the command prompt to write an input. However when I try and enter the input it just hangs and the server doesn't seem to receive the message. Anyone know why this is?

谢谢,如果这还不够清楚,请说

Thanks, please say if this isn't clear enough

这是我的聊天服务器:

from twisted.protocols import basic



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')


from twisted.internet import reactor, protocol
from twisted.application import service, internet

factory = protocol.ServerFactory()
factory.protocol = MyChat
factory.clients = []
reactor.listenTCP(8004, factory)
reactor.run()

这是我的客户:

from twisted.internet import reactor, protocol


# a client protocol

class EchoClient(protocol.Protocol):

    def sendData(self):
        data = raw_input("> ")
        if data:
            print "sending %s...." % data
            self.transport.write(data)
        else:
            self.transport.loseConnection()

    def connectionMade(self):
        self.sendData()

    def dataReceived(self, data):
        print data
        self.sendData()

    def connectionLost(self, reason):
        print "connection lost"

class EchoFactory(protocol.ClientFactory):
    protocol = EchoClient

    def clientConnectionFailed(self, connector, reason):
        print "Connection failed - goodbye!"
        reactor.stop()

    def clientConnectionLost(self, connector, reason):
        print "Connection lost - goodbye!"
        reactor.stop()


# this connects the protocol to a server runing on port 8000
def main():
    f = EchoFactory()
    reactor.connectTCP("localhost", 8004, f)
    reactor.run()

# this only runs if the module was *not* imported
if __name__ == '__main__':
    main()

推荐答案

您在客户端中犯了一个错误.基本上,服务器希望接收行,这意味着数据以换行符终止.但是,客户端发送的数据末尾没有换行符.

You made a mistake in the client. Basically, server expects to receive lines, meaning data terminated by newline. However, client sends data without newline character at the end.

因此,要修复客户端,只需将\r\n添加到数据中即可:

So, to fix client, just add \r\n to the data:

self.transport.write(data + "\r\n")

这是客户端协议:

class EchoClient(protocol.Protocol):

    def sendData(self):
        data = raw_input("> ")
        if data:
            print "sending %s...." % data
            self.transport.write(data + "\r\n")
        else:
            self.transport.loseConnection()

    def connectionMade(self):
        self.sendData()

    def dataReceived(self, data):
        print data
        self.sendData()

    def connectionLost(self, reason):
        print "connection lost"

这篇关于使用简单的Twisted聊天服务器遇到麻烦的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆