我需要编写一个应用程序来联系服务器。发送一些消息后,应该允许用户通过发送命令和接收结果与服务器进行交互。
我应该如何管理当前套接字,以便用户可以与服务器进行交互而无需读取输入和从/向stdin / stdout写入输出?
答案 0 :(得分:2)
你的意思是喜欢使用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))
答案 1 :(得分:-1)
你可能想要像pexpect这样的东西。基本上你创建一个spawn
对象来启动连接(例如通过ssh
),然后使用该对象的expect()
和sendline()
方法发出你想要发送的命令提示。然后,您可以使用interact()
方法将控制权交给用户。