Python中Twisted TCP客户端的self.transport.write()问题

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (314)

我在python中有一个非常基本的扭曲服务器/客户端设置。

server.py:

from twisted.internet.protocol import Protocol
from twisted.internet.protocol import Factory
from twisted.internet.endpoints import TCP4ServerEndpoint
from twisted.internet import reactor

class Echo(Protocol):

    def __init__(self, factory):
        self.factory = factory

    def connectionMade(self):
        print("Connection made")

    def connectionLost(self):
        print("Connection lost")

    def dataReceived(self, data):
        print("Received data")
        print(data)
        self.transport.write(data)


class EchoFactory(Factory):
    def buildProtocol(self, addr):
        return Echo(self)


def main():
    PORT = 9009 #the port you want to run under. Choose something >1024
    endpoint = TCP4ServerEndpoint(reactor, PORT)
    endpoint.listen(EchoFactory())
    reactor.run()


if __name__ == "__main__":
    main()

client.py:

from twisted.internet import reactor
from twisted.internet.protocol import Protocol
from twisted.internet.endpoints import TCP4ClientEndpoint, connectProtocol

class Greeter(Protocol):
    def sendMessage(self, msg):
        print('sending message')
        self.transport.write("MESSAGE %s\n" % msg)
        print('message sent')

def gotProtocol(p):
    p.sendMessage("Hello")
    reactor.callLater(1, p.sendMessage, "This is sent in a second")
    reactor.callLater(2, p.transport.loseConnection)

PORT = 9009
point = TCP4ClientEndpoint(reactor, "localhost", PORT)
d = connectProtocol(point, Greeter())
d.addCallback(gotProtocol)
print('running reactor')
reactor.run()

服务器工作正常,因为我已经使用Telnet客户端进行了ping操作并收到了预期的响应。但是,当我尝试运行client.py时,它会陷入“self.transport.write(”MESSAGE%s \ n“%msg)”。或者至少我认为它是打印到控制台的最后一件事是'发送消息'。

我已经搜索了几天,但似乎无法弄清楚什么是错的(我对网络很新)。我在这做错了什么?我正在使用Python 3并运行Windows 8.1。

提问于
用户回答回答于

它不会卡在self.transport.write("MESSAGE %s\n" % msg)它实际上失败了。Transport.write只接受bytes。编码字符串,它应该工作。

class Greeter(Protocol):

    def sendMessage(self, msg):
        print('sending message')
        self.transport.write(("MESSAGE %s\n" % msg).encode('utf8'))
        print('message sent')

热门问答

智能钛能处理大数据文件吗?我有30G的数据存储在本地电脑硬盘上?

腾讯智能钛AI开发者

腾讯云 · 智能钛产品团队 (已认证)

腾讯智能钛产品团队官方运营账号。分享产品最新动态,第一时间解答用户疑问。
推荐

硬盘可以升级吗?

最爱开车啦互联网的敏感者
推荐

可以升级,小微活动中没有云硬盘的的,后续可以用同帐号在官网购买和服务器同地域同地区的云硬盘挂载到服务器上使用。

云硬盘挂载初始化方法 可参考 https://cloud.tencent.com/document/product/362/6735

云通信 70402 错误?

推荐已采纳

参数非法,请检查必填字段是否填充,或者字段的填充是否满足协议要求。

您好,可参考此文档:https://cloud.tencent.com/document/product/269/1671

录音识别sdk的录音文件如何保存?

Richel码农
推荐

1.实时语音sdk内置录音器采集音频暂不支持保存语音数据,如需要保存语音数据建议上层自行采集音频数据。

2.实时语音识别sdk不支持暂停&继续操作,停止识别后重新调用start即开始识别。

云通讯im 本地消息存储数据库能否开放使用,要做一个本地聊天记录搜索功能?

推荐
您好,首先核实下您是否咨询app本地存储?App 本地存储;默认情况下,SDK 内部会对收到的消息进行存储,无需用户进行存储。用户可调用接口获取本地消息(无网络操作),另外,通过 getMessage 接口,也会获取本地消息,如果本地消息存在断层,会通过漫游消息补全。消息存储详参...... 展开详请

服务器操作台不是Windows咋换?

蒋小爱

腾讯云 · 技术支持 (已认证)

推荐
您好,您参考重装Windows系统;仅支持中国大陆地域(不含香港)。例如,Linux 重装为 Windows,Windows 重装为 Linux 。 登陆控制台 图片.png 选择【公共镜像】中Windows ,配置Windows密码,点击【开始重装】即可更换Windows 图片...... 展开详请

所属标签

扫码关注云+社区

领取腾讯云代金券