我正在尝试使用 Python Twisted 为简单的 TCP 服务器编写客户端。当然,我对 Python 还很陌生,刚刚开始研究 Twisted,所以我可能会做错。
服务器很简单,您打算使用 nc 或 telnet。没有认证。您只需连接并获得一个简单的控制台。我想编写一个添加一些 readline 功能的客户端(历史记录和像 ctrl-a/ctrl-e 这样的 emacs 是我想要的)
下面是我编写的代码,其工作效果与从命令行使用 netcat 一样好,如下所示nc localhost 4118
from twisted.internet import reactor, protocol, stdio
from twisted.protocols import basic
from sys import stdout
host='localhost'
port=4118
console_delimiter='\n'
class MyConsoleClient(protocol.Protocol):
def dataReceived(self, data):
stdout.write(data)
stdout.flush()
def sendData(self,data):
self.transport.write(data+console_delimiter)
class MyConsoleClientFactory(protocol.ClientFactory):
def startedConnecting(self,connector):
print 'Starting connection to console.'
def buildProtocol(self, addr):
print 'Connected to console!'
self.client = MyConsoleClient()
self.client.name = 'console'
return self.client
def clientConnectionFailed(self, connector, reason):
print 'Connection failed with reason:', reason
class Console(basic.LineReceiver):
factory = None
delimiter = console_delimiter
def __init__(self,factory):
self.factory = factory
def lineReceived(self,line):
if line == 'quit':
self.quit()
else:
self.factory.client.sendData(line)
def quit(self):
reactor.stop()
def main():
factory = MyConsoleClientFactory()
stdio.StandardIO(Console(factory))
reactor.connectTCP(host,port,factory)
reactor.run()
if __name__ == '__main__':
main()
输出:
$ python ./console-console-client.py
Starting connection to console.
Connected to console!
console> version
d305dfcd8fc23dc6674a1d18567a3b4e8383d70e
console> number-events
338
console> quit
我看过
Python Twisted 与 Cmd 模块集成 https://stackoverflow.com/questions/8568241/python-twisted-integration-with-cmd-module
这对我来说确实不成功。示例代码工作得很好,但是当我介绍网络时,我似乎与 stdio 存在竞争条件。这个较旧的链接似乎提倡类似的方法(在单独的线程中运行 readline),但我并没有走得太远。
我还研究了扭曲的海螺侮辱,但除了演示示例之外,我没有运气得到任何东西。
制作一个提供 readline 支持的基于终端的客户端的最佳方法是什么?
http://twistedmatrix.com/documents/current/api/twisted.conch.stdio.html http://twistedmatrix.com/documents/current/api/twisted.conch.stdio.html
看起来很有希望,但我很困惑如何使用它。
http://twistedmatrix.com/documents/current/api/twisted.conch.recvline.HistoricRecvLine.html http://twistedmatrix.com/documents/current/api/twisted.conch.recvline.HistoricRecvLine.html
例如,似乎还提供了对处理向上和向下箭头的支持,但我无法切换 Console 来继承 HistoricRecVLine 而不是 LineReceiver 来运行。
也许扭曲是使用错误的框架,或者我应该使用所有海螺类。我只是喜欢它的事件驱动风格。是否有更好/更简单的方法来在扭曲的客户端中提供 readline 或类似 readline 的支持?