2011-11-23 92 views
3

2路通信我想在Python雙向通信:插座:在Python

我想綁定一個套接字,其中一個客戶端可以連接到,然後服務器和客戶端可以通過「聊天」海誓山盟。

我已經有基本的聽衆:

import socket 
HOST='' #localhost 
PORT=50008 

s=socket.socket(socket.AF_INET, socket.SOCK_STREAM) #create an INET, STREAMing socket 
s.bind((HOST,PORT)) #bind to that port 
s.listen(1) #listen for user input and accept 1 connection at a time. 

conn, addr = s.accept() 

print "The connection has been set up" 
bool=1 
while bool==1: 
     data=conn.recv(1024) 
     print data 
     if "#!END!#" in data: 
       print "closing the connection" 
       s.close() 
       bool=0 

我想現在要做的是實現東西,所以這個腳本也接受用戶輸入並回車鍵被擊中後,發回給客戶端。

但我不明白我該如何做到這一點?因爲如果我會做這樣的:

while bool==1: 
    data=conn.recv(1024) 
    print data 
    u_input = raw_input("input now") 
    if u_input != "": 
     conn.send(u_input) 
     u_input= "" 

問題是,它可能掛在用戶輸入提示,所以它不會讓我的客戶端發送的數據。

我該如何解決這個問題?

我想把它保存在一個窗口中,這可以用線程解決嗎?

(我從來沒有用過的python線程)

+1

(沒有解決您的PROB LEM)'bool'是一種內置類型,您可以覆蓋它,因此您可能想要使用不同的變量名稱。一個更好的解決方案可能是'while True'與'break'結合。 –

+0

你想發送每一個字符嗎?還是全文? –

+0

@ wal-o-mat全文 –

回答

2

的基本問題是,你必須輸入的兩個來源,你就等着:插座和用戶。我能想到的三種主要方法是使用異步I/O,在多線程中使用同步(阻塞)I/O,或者使用帶有超時的同步I/O。最後一種方法在概念上是最簡單的:在一段時間內等待套接字上的數據,然後切換到等待用戶輸入數據發送,然後返回到套接字等。

我知道在較低的級別,您可以通過將I/O處理程序同時處理套接字和stdin,並使用select同時等待它們來相對輕鬆地實現這一點,但是我不記得該功能是否映射到Python,或者如果是這樣,怎麼樣。如果你能使它工作,這可能是一個很好的處理方法。編輯:我查了一下,Python確實有一個select模塊,但它聽起來像在Unix操作系統下只能這樣工作 - 在Windows中,它只能接受套接字,而不是stdin或文件。

+0

我正在linux下工作,所以我不介意:p –

+0

如果Windows的兼容性不是問題,那麼select就是我個人的偏好。 – qid

0

你檢查了扭曲? twisted蟒蛇事件驅動的網絡引擎和庫或 oidranot一個Python庫特別是對於基於torando Web服務器上

3

Python的插座有一個makefile tool,使這種互動更加容易。在創建套接字的s後,然後運行f = s.makefile()。這將返回一個文件類接口的對象(所以你可以使用readline,,writelines和其他方便的方法調用)。 Python標準庫本身使用這種方法(例如,參見ftplibpoplib的來源)。

要從客戶端獲取文本並將其顯示在服務器控制檯上,請使用print f.readline()編寫一個循環。

要從服務器控制檯獲取文本並將其發送到客戶端,請使用f.write(raw_input('+ ') + '\n')編寫一個循環。

要發送,並在同一時間收到,做這兩個步驟單獨的線程:

Thread(target=read_client_and_print_to_console).start() 
Thread(target=read_server_console_and_send).start() 

如果你喜歡異步過線,這裏有兩個例子讓你開始:

+0

是的,但我仍然不明白我將如何能夠要求用戶輸入並同時寫入屏幕:( –