我想做的是将 Twisted 与 python 标准库中的 Cmd 模块结合起来。
简而言之,我希望能够从连接的协议(protocol)中获取基本的套接字 fd 对象,以用作标准库中 cmd.Cmd 模块的标准输入。
总而言之,与我的服务器交互的我的客户端使用 Cmd 模块来处理命令并将这些命令发送到服务器。
在我的服务器上,我也想使用与构建 Cmd 模块相同的命令处理方法。为此,我需要指定命令解释器的标准输入和标准输出。 我可以使用内置套接字模块轻松地做到这一点,但如果可能的话,我想用扭曲的方式来做到这一点。
这里有一些代码可以用普通套接字做我想做的事情:
(使用远程登录)
# server
import socket
import cmd
class CmdProcessor(cmd.Cmd, object):
def __init__(self, sock, addr):
network = sock.makefile()
super(CmdProcessor, self).__init__(stdin=network, stdout=network)
self.sock = sock
self.addr = addr
# Run the cmd.Cmd processing loop
self.cmdloop()
def do_sayhi(self, args):
# When 'sayhi' is recieved over the socket,
self.sock.send("Hey yourself!")
def do_quit(self, args):
self.sock.close()
if __name__ == "__main__":
server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_sock.bind(("0.0.0.0", 2319))
server_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_sock.listen(5)
sock, addr = server_sock.accept()
print("Connection accepted")
connection = CmdProcessor(sock, addr)
这就是几乎我想做的。我只是快速输入了这个,所以我可能会遗漏一些东西。一半有效。目前,如果您像这样远程登录到服务器:
telnet 127.0.0.1 2319
然后你发送'sayhi' 没有任何反应。但是,如果您在终端上键入“sayhi”,您从(有一个(Cmd)提示符)启动服务器,输出将转到 telnet 客户端。所以 cmd.Cmd 的标准输出正在工作。但不是标准输入。这可能与 telnet 默认发送 CR-LF ('\r\n') 这一事实有关。 cmd 模块可能只监听\n。
那么如何从扭曲的协议(protocol)中获取 fd 或文件对象来完成我在这里尝试使用裸套接字实现的目标?
关于连接到服务器的 telnet 输入没有向 CmdProcessor 注册的任何见解?
欢迎任何建议、提示或指点。 (等等,没有指针。) 谢谢。
最佳答案
我建议您改为查看 Manhole .
一般来说,Twisted 的重点是不直接使用Python 套接字对象。这是 Twisted 工作的重要组成部分。当您想使用 Twisted 与网络交互时,您可以使用 Twisted 的 API - 协议(protocol)和传输,如果您正在考虑最低级别的话。
关于python - 从 python 中的 Twisted 协议(protocol)获取裸套接字 fd?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24392149/