2015-12-29 165 views
0

在我嘗試掌握Python的網絡概念時,我創建了一個簡單的服務器客戶端程序。服務器創建一個套接字並檢查連接,然後向所有連接的實體發送消息。像這樣,替代socket.accept()方法

import socket,os 
ip='' 
port=242 
sock = socket.socket() 
sock.bind((ip,port)) 
sock.listen(5) 
clients=[] 
while True: 
    clients.append(sock.accept()) 
    os.system('cls') 
    print 'connected to: ' 
    for client in clients: 
     print client[1] 
    message=raw_input('> ') 
    for client in clients: 
     try: 
      client[0].send(message) 
     except: 
      clients.remove(client) 

程序但似乎停止,直到接收的連接。如果我想實現聊天的元素,這是有點困難的。我知道我可以將socket.accept()置於循環之外,但是我打算有多個客戶端(因此爲.append())。 我已經提供了我的客戶端代碼,以防有任何影響。

import socket 
port=int(raw_input('enter the socket adress: ')) 
sock=socket.socket() 
sock.connect(('localhost',port)) 
connected=True 
while connected: 
    data=sock.recv(1024) 
    if data=='#exit': 
     connected=False 
    else: 
     print data 

請在寫回復時考慮到我是一名自學成才的高中新生,對Python的知識有限。 (如果從我的程序的格式不明顯...:'[]

注意:我試圖避免select()方法,因爲它再次超出了我目前的理解範圍。

+0

你說你試圖避免選擇(),如果你無法圍繞這一點,多線程將真正挑戰你。如果你想做你想要的定向多重演員,那麼你必須是一個或另一個。 – msw

回答

2

對於服務器來接收和管理多個客戶端連接,有兩種常見的方法(可能還有其他不常用的方法,我不會介紹)。

多線程的方式

在這種方法中應用程序中有兩個線程。如果你沒有在線程上做太多的工作,它非常粗略地意味着你的應用程序同時運行兩個程序並且它們共享數據。

一環(接收線程):

  • 等待新的連接(例如調用accept())
  • 添加新的連接列出

環兩(輸入線程):

  • 等待用戶輸入(例如調用原始輸入())
  • 將輸入發送到連接列表中的每個連接

在這種情況下,接受塊(等待)直到新連接到達因爲這就是所有線程的作用並不重要。請記住,連接列表由兩個循環共享,這是要小心處理的事情。谷歌和線索谷歌搜索將爲您提供豐富的信息開始。

無阻塞環方法

在這種方法中,有一個單一的線程循環遍歷並在循環的每次迭代檢查各種事情。例如,循環如下所示:

  • 我有任何新的連接正在等待嗎?
  • 如果是這樣,處理它們,如果不是,則繼續(不要等待連接)
  • 我有任何用戶輸入?
  • 如果是這樣,處理它,如果沒有則繼續(不等待用戶輸入)

的select()機制是非常相似,我剛纔所描述的,但它也有一些等待。循環更類似於:

  • 等待,直到一些有趣的事情發生
  • 是一些有趣的一個新的連接?如果是這樣,接受它。
  • 那是一些有趣的新用戶輸入嗎?如果是這樣,發送它。

權衡

兩種方法可以概括爲「在同一時間運行兩個簡單的循環」或「一個複雜的循環,但沒有別的在同一時間運行」。

多線程方法使每個線程的代碼保持獨立,但必須處理如果兩個循環嘗試同時訪問連接列表會發生什麼情況。單線程方法不必擔心這個問題,但結果會更復雜一些。

這兩種方法都呈現出有趣的學習機會。