Python 中 Twisted TCP 客户端的 self.transport.write() 问题
Posted
技术标签:
【中文标题】Python 中 Twisted TCP 客户端的 self.transport.write() 问题【英文标题】:Problems with self.transport.write() for Twisted TCP client in Python 【发布时间】:2018-08-02 21:30:24 【问题描述】:我在 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。
【问题讨论】:
【参考方案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')
【讨论】:
在某个版本的 Python 和/或 Twisted 之后,“utf8”是默认编码,所以你可以使用encode()
。我不记得是哪个了,但你去吧。以上是关于Python 中 Twisted TCP 客户端的 self.transport.write() 问题的主要内容,如果未能解决你的问题,请参考以下文章
python twisted 写tcp 客户端 服务器 为啥self.transport.write传送多数据的时候,接受到是一起接受呢