我正在尝试使用 Python Twisted 为简单的 TCP 服务器编写客户端。当然,我对 Python 很陌生,刚开始研究 Twisted,所以我可能做错了。
服务器很简单,您打算使用 nc 或 telnet。没有身份验证。您只需连接并获得一个简单的控制台。我想编写一个添加一些 readline 功能的客户端(历史和 emacs,如 ctrl-a/ctrl-e 是我所追求的)
下面是我编写的代码,它与在命令行中使用 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
我看过
这真的不适合我。示例代码效果很好,但是当我介绍网络时,我似乎遇到了 stdio 的竞争条件。这个较旧的链接似乎提倡类似的方法(在单独的线程中运行 readline),但我并没有走得太远。
我也研究过扭曲的海螺侮辱,但除了演示示例之外,我没有任何运气可以工作。
制作可提供 readline 支持的基于终端的客户端的最佳方法是什么?
http://twistedmatrix.com/documents/current/api/twisted.conch.stdio.html
看起来很有希望,但我很困惑如何使用它。
http://twistedmatrix.com/documents/current/api/twisted.conch.recvline.HistoricRecvLine.html
例如,似乎也提供了对处理向上和向下箭头的支持,但我无法让切换控制台从 HistoricRecVLine 继承而不是 LineReceiver 来运行。
也许扭曲的框架是错误的,或者我应该使用所有的海螺类。我只是喜欢它的事件驱动风格。在扭曲的客户端中是否有更好/更简单的方法来获得类似 readline 或 readline 的支持?