我正在跟踪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/

10-12 23:14