2013-03-07 91 views
0

我一直在四處尋找,但我一直無法解決我在聊天客戶端遇到的問題。如何避免使用套接字阻塞(聊天客戶端)

問題出在這裏:我最近決定改變客戶端,以便它允許用戶輸入他們想要的任何消息,而不必等待回覆(阻止或阻止我的程序直到回覆)

我決定使用select.select模塊來做到這一點,但是今天寫了幾個不同版本的客戶端試圖讓它工作,我一直在這一點上陷入困​​境。

每當我輸入消息,循環卡住某處,(可能在.recv數據) 我該如何解決這個問題?沒有任何我嘗試讓它通過。

編輯:更清楚的是,當我跑步時,我達到了輸入消息的地步,按回車鍵,然後什麼也沒有發生。它只是保持這樣運行。

from socket import * 
import select 
import sys #because why not? 

print("New Chat Client Using Select Module") 

HOST = input("Host: ") 
PORT = int(input("Port: ")) 

s = socket(AF_INET,SOCK_STREAM) 

print("Trying to connect....") 
s.connect((HOST,PORT)) 
s.setblocking(0) 
# Not including setblocking(0) because select handles that. 
print("You just connected to",HOST,) 

# Lets now try to handle the client a different way! 

while True: 
    Incoming_data = [s] 
    Exportable_data = [] 

    Exceptions = [] 
    User_input = input("Your message: ") 

    rlist,wlist,xlist = select.select(Incoming_data,Exportable_data,Exceptions) 

    if User_input == True: 
     Exportable_data += [User_input] 

    for i in rlist: 
     data = i.recv(1024) 
     if data == "": 
      continue 

    for i in wlist: 
     if Exportable_data is True: 
      i.send(Exportable_data) 
      continue 

當設置爲接收數據時,是否有任何方法可以覆蓋阻塞(我認爲是問題)?不會s.setblocking(0)做它,所以它不會阻止(?)(帶或不帶它仍然卡)

感謝您抽空看看

回答

0

我想你應該有單獨的線程或進程將與您的套接字和另一個線程進行交互,該線程將接受用戶輸入並打印聊天消息。您可以使用2個隊列執行的線程之間的交互:用於傳入和傳出的消息。

看看threadingqueue模塊。

+0

我會看看我能做什麼,但我是全新的隊列和線程。我要廢棄select.select模塊嗎?然後只使用線程和隊列?或者將select.select與線程和隊列結合起來? http://i.imgur.com/xVyoSl.jpg – Micrified 2013-03-07 19:06:56

+0

我沒有想法該怎麼做。現在一整天,我可能會接近0.000001%。我該如何使用線程和隊列?沒有任何文檔可以幫助我使用套接字進行設置。就我所知,我可以創建一個隊列。但是我所要做的就是陷入同樣的​​問題中。 – Micrified 2013-03-07 20:30:53

+0

對不起,我一整天都很耐心,現在我已經足夠迷路了。 – Micrified 2013-03-07 20:31:28