2012-08-30 80 views
0

我需要編寫一個應用程序來聯繫到服務器。發送幾條消息後,它應該允許用戶通過發送命令和接收結果與服務器進行交互。如何將python套接字連接到stdin/stdout

我該如何管我的當前套接字,以便用戶可以與服務器交互,而無需讀取輸入並將輸出寫入/到stdin/stdout?

回答

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

你可能要像pexpect。基本上你會創建一個spawn對象來啓動連接(例如,通過ssh),然後使用該對象的expect()sendline()方法來發出要在提示處發送的命令。然後,您可以使用interact()方法將控制權轉交給用戶。