我需要编写一个应用程序来联系服务器。发送一些消息后,它应该允许用户通过发送命令和接收结果与服务器交互。
我应该如何管道我当前的套接字,以便用户可以与服务器交互而无需从/向 stdin/stdout 读取输入和写入输出?
你的意思是像使用netcat?
cat initial_command_file - | nc host:port
答案是,有些东西需要读写。在上面的示例 shell 脚本cat
中,依次从两个源读取,并写入单个管道;nc
从该管道读取并写入套接字,但也从套接字读取并写入其stdout
.
所以总会有一些阅读和写作……然而,你可以构建你的代码,这样就不会侵入通信逻辑。
例如,您使用itertools.chain创建一个行为类似于 的输入迭代器cat
,因此您的面向 TCP 的代码可以采用单个输入可迭代:
def netcat(input, output, remote):
"""trivial example for 1:1 request-response protocol"""
for request in input:
remote.write(request)
response = remote.read()
output.write(response)
handshake = ['connect', 'initial', 'handshake', 'stuff']
cat = itertools.chain(handshake, sys.stdin)
server = ('localhost', 9000)
netcat(cat, sys.stdout, socket.create_connection(server))
你可能想要像pexpect这样的东西。基本上,您将创建一个spawn
启动连接的对象(例如 via ssh
),然后使用该对象的方法expect()
和sendline()
方法来发出您要在提示时发送的命令。然后您可以使用该interact()
方法将控制权交给用户。