我正在跟踪Twisted tutorial并尝试了该文章中的以下代码:
# Read username, output from non-empty factory, drop connections
from twisted.internet import protocol, reactor
from twisted.protocols import basic
class FingerProtocol(basic.LineReceiver):
def lineReceived(self, user):
self.transport.write(self.factory.getUser(user)+"\r\n")
self.transport.loseConnection()
class FingerFactory(protocol.ServerFactory):
protocol = FingerProtocol
def __init__(self, **kwargs):
self.users = kwargs
def getUser(self, user):
return self.users.get(user, "No such user")
reactor.listenTCP(1079, FingerFactory(moshez='Happy and well'))
reactor.run()
我尝试了
nc localhost 1079
,但它挂起了:没有回复。但是然后telnet localhost 1079
可以正常工作。为什么? 最佳答案
使用Wireshark,我发现了以下内容:telnet
发送0x0d,然后发送0x0a(即“ \ r \ n”)作为线路终止符。但是netcat
仅发送0x0a。这是在Ubuntu(以及OS X)上。
显然,Twisted中的LineReceiver
协议要求\ r才能引发“线路接收”事件。
至少有6个netcat
版本,但是OS X(与FreeBSD接近)上的版本具有-c
选项,该选项将\ r \ n附加到每行的末尾。使用此选项可解决问题。
$ nc -c localhost 1079
moshez
Happy and well
注意:
LineReceiver
有一个名为delimiter
的类变量,该变量允许使用任何EOL字符。设置delimiter = '\n'
消除了对netcat使用-c
选项的需要。关于python - 为什么在这个Twisted示例中telnet和netcat会失败?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35967142/