0

我需要编写一个应用程序来联系服务器。发送一些消息后,它应该允许用户通过发送命令和接收结果与服务器交互。

我应该如何管道我当前的套接字,以便用户可以与服务器交互而无需从/向 stdin/stdout 读取输入和写入输出?

4

2 回答 2

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))
于 2012-08-30T21:55:07.707 回答
-1

你可能想要像pexpect这样的东西。基本上,您将创建一个spawn启动连接的对象(例如 via ssh),然后使用该对象的方法expect()sendline()方法来发出您要在提示时发送的命令。然后您可以使用该interact()方法将控制权交给用户。

于 2012-08-30T21:55:48.383 回答