我需要編寫一個應用程序來聯繫到服務器。發送幾條消息後,它應該允許用戶通過發送命令和接收結果與服務器進行交互。如何將python套接字連接到stdin/stdout
我該如何管我的當前套接字,以便用戶可以與服務器交互,而無需讀取輸入並將輸出寫入/到stdin/stdout?
我需要編寫一個應用程序來聯繫到服務器。發送幾條消息後,它應該允許用戶通過發送命令和接收結果與服務器進行交互。如何將python套接字連接到stdin/stdout
我該如何管我的當前套接字,以便用戶可以與服務器交互,而無需讀取輸入並將輸出寫入/到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
對象來啓動連接(例如,通過ssh
),然後使用該對象的expect()
和sendline()
方法來發出要在提示處發送的命令。然後,您可以使用interact()
方法將控制權轉交給用戶。