2013-08-30 63 views
1

我有這個簡單的服務器腳本。我此腳本的目標是:Python套接字(簡單服務器腳本)

  1. 等待客戶端連接
  2. 接收來自客戶端的按摩,直到客戶端斷開
  3. 一旦客戶端斷開連接,等待另一個客戶端連接
  4. 享受按摩,直到客戶端斷開
  5. 重複...

import socket 

server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 
server_socket.bind(("",5000)) 
server_socket.listen(5) 
print "Awaiting Client connection" 
client_socket, address =server_socket.accept() 
print "Connection established.. with ",address 
while True: 
    data=client_socket.recv(512) 
    if not data: 
     client_socket.close() 
     print "Client disconnected, Awaiting new connections..." 
     client_socket, address =server_socket.accept() 
     print "Connection from ",address 
    else: 
     print "RECIEVED:",data 

我的問題是即使腳本似乎是工作,當我在一對電腦進行測試,我注意到,它收到來自客戶端的連接後,即line no 7

print "Connection established.. with ",address 

python shell窗口似乎沒有響應(如果我嘗試移動shell窗口,則不響應)直到客戶端發送任何消息。

據我所知,如果沒有來自客戶端的傳入消息,client_socket.recv(512)將只等待來自客戶端的數據。

但爲什麼它變得沒有反應? 爲了讓事情更清晰,

-The腳本工作得很好(它接收數據,並從屏幕打印出來&等待,如果客戶端斷開連接的新的連接)在控制檯窗口

-the光標停止閃爍

- 當我試圖走動控制檯窗口,它變得反應遲鈍和窗戶給我留言「該程序停止響應」

+0

的'recv'方法阻止 - 見http://stackoverflow.com/questions/9770567/python-tcp-socket-blocks-on-recv-method。 – leon

回答

1

基本上,在accept調用,它是此行之後目前你的腳本塊:

print "Client disconnected, Awaiting new connections..." 

accept調用將僅在特定客戶端嘗試連接到服務器時返回。那就是當你的腳本將繼續執行到下一行時。這就是爲什麼你會看到類似於的消息的原因。該程序在Windows中未響應

您可以考慮使用非阻塞套接字I/O方法以確保您的腳本具有響應能力。

請參閱this鏈接瞭解阻塞和非阻塞呼叫的描述。你也可以參考this問題來理解如何在Python中實現非阻塞套接字 - 當然也有大量的網絡資源。

希望這有助於

相關問題