2

我正在尝试实现一个简单的命令行客户端,它接受来自服务器的消息并将它们打印到标准输出,而用户输入的命令被转换为服务器请求。现在它是用twisted和Cmd完成的:

from sys import stdout
from cmd import Cmd

from twisted.internet import reactor
from twisted.internet.protocol import Protocol
from twisted.internet.endpoints import TCP4ClientEndpoint, connectProtocol

class MyCmd(Cmd):    
    def __init__(self, client):
        Cmd.__init__(self)
        self.client = client

    def default(self, line):
        client.sendData(line)

    def do_EOF(self, line):
        if reactor.running:
            reactor.stop()
        stdout.write("\n")
        return True


class MyClient(Protocol):
    def dataReceived(self, data):
        stdout.write(data)

    def sendData(self, data):
        self.transport.write(data)
        self.transport.write("\n")

point = TCP4ClientEndpoint(reactor, "localhost", 6004)
client = MyClient()
connectProtocol(point, client)
reactor.callInThread(MyCmd(client).cmdloop)
reactor.run()

这需要异步完成,因为服务器有时只是向客户端发送未经请求的数据。但是通过这种方式写入标准输出的文本MyClient.dataReceived与 Cmd 的控制台处理发生冲突,使其几乎无法使用。

我正在考虑通过使用某种控制台 UI 库(例如 Urwid 或 ncurses)将 MyCmd 和 MyClient 的输出放入屏幕的单独部分。

2009 年的这个帖子表明使用 Urwid 可能是不可能的:http: //lists.excess.org/pipermail/urwid/2009-July/000715.html

这个用 ncurses 完成的要点对我来说不太好用:https ://gist.github.com/interstar/3005137

以某种方式仍然可能吗?

4

0 回答 0