我想要做的是将Twisted与python的stdlib中的Cmd模块结合起来。
简而言之,我希望能够从连接的协议中获取bare-bones套接字fd对象,以用作stdlib中cmd.Cmd模块的stdin。
在Long中,与我的服务器接口的客户端使用Cmd模块处理命令并将这些命令发送到服务器。
在我的服务器上,我还想使用与构建Cmd模块相同的命令处理方法。为此,我需要指定命令解释器的stdin和stdout。 我可以使用内置套接字模块轻松完成这项工作,但如果可能,我想用扭曲的方式来做。
这是一些用普通套接字做我想要的代码:
(与telnet合作)
# 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到服务器,如:
telnet 127.0.0.1 2319
你发送' sayhi'什么都没发生。但是,如果你输入' sayhi'在终端你启动服务器(有一个(Cmd)提示)输出到telnet客户端。所以cmd.Cmd的标准输出正在工作。但不是斯坦丁。这可能与telnet默认发送CR-LF(' \ r \ n')这一事实有关。 cmd模块可能只听取\ n。
那么怎样才能从协议中获取fd或file对象来做我正在尝试用裸插座实现的目标?
有关telnet连接到服务器的输入是不是在CmdProcessor中注册的任何见解?
欢迎任何建议,提示或指示。 (等等不,没有指针。) 感谢。
答案 0 :(得分:1)
我建议您可以查看Manhole。
通常,Twisted的重点是不直接使用Python套接字对象。这是Twisted工作的重要组成部分。当您想使用Twisted与网络进行交互时,如果您考虑的是最低级别,则使用Twisted的API - 协议和传输。
答案 1 :(得分:0)
您可以添加use_rawinput = False
class CmdProcessor(cmd.Cmd, object):
use_rawinput = False
def __init__(self, sock, addr):
....
这会从telnet产生对sayhi的响应