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



我在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 %sn" % 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 %sn" % msg)上卡住,实际上它在那里失败了。Transport.write只接受bytes。对字符串进行编码,它应该可以工作。

class Greeter(Protocol):
def sendMessage(self, msg):
print('sending message')
self.transport.write(("MESSAGE %sn" % msg).encode('utf8'))
print('message sent')

最新更新