为什么telnet工作和netcat失败了这个Twisted示例?

Fix*_*xee 1 python twisted telnet netcat

我正在关注Twisted教程,并尝试了该文章中的以下代码:

# 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()
Run Code Online (Sandbox Code Playgroud)

我尝试了nc localhost 1079它只是挂起:没有回复.但后来telnet localhost 1079工作得很好.为什么?

Fix*_*xee 5

使用wireshark,我想出了以下内容:telnet为行终止符发送0x0d然后0x0a(即"\ r \n").但是netcat只发送0x0a.这是在Ubuntu上(也在OS X上).

显然LineReceiver,Twisted中的协议需要\ r才能引发"线路接收"事件.

那里至少有6个版本netcat,但OS X上的一个版本(接近FreeBSD)有一个-c选项,可以将\ r \n附加到每行的末尾.使用此选项可以解决问题.

$ nc -c localhost 1079 
moshez
Happy and well
Run Code Online (Sandbox Code Playgroud)

注意:LineReceiver有一个类变量delimiter,允许使用任何EOL字符.设置delimiter = '\n'不需要-cnetcat 的选项.