我跟随Twisted tutorial并尝试了该文章中的以下代码:
ConvertTo-Csv
我试过了# 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
就可以了。为什么呢?
答案 0 :(得分:5)
使用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
选项。
答案 1 :(得分:1)
在Linux上,您需要将CRLF用作EOL
来自nc手册页:
-C, - crlf(将CRLF用作EOL)。 此选项告诉Ncat转换LF。 CRLF的行结尾。当从标准输入中获取输入时。这对于直接从终端与一些严格的服务器通信是很有用的,这些服务器使用CRLF作为终端的许多常见纯文本协议之一。