【问题标题】:How to pipe python socket to a stdin/stdout如何将 python 套接字通过管道传输到标准输入/标准输出
【发布时间】:2012-08-30 21:38:48
【问题描述】:

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

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

【问题讨论】:

    标签: python sockets pipe


    【解决方案1】:

    你是说喜欢用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))
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        最近更新 更多