Python學習:Socket編程——多用戶端通訊聊天室

來源:互聯網
上載者:User

標籤:socket編程   com   拒絕   merge   應用程式   函數   list   編程   轉寄   

  最近學習Python,又需要學習一下網路編程的一些知識,寫了一個簡單的聊天室的程式。程式分為兩個python檔案,一個是server.py,另一個是client.py。

  Socket編程的流程如所示:

  

  

  服務端:

  1.服務端需要建立一個socket對象。(socket())

  2.為這個socket對象綁定ip地址和連接埠號碼。(bind())

  3.讓socket對象進入監聽狀態,傳入的參數是指定在拒絕串連之前,作業系統可以掛起的最大串連數量。該值至少為1,大部分應用程式設為5就可以了。(listen())

  4.在while True迴圈裡接收用戶端發送過來的串連請求,如果沒有串連請求該迴圈會被阻塞。(accept()是否返回了值)

  5.服務端接收到用戶端發送過來的串連請求後(accept()有了傳回值),返回一個新的socket對象和list類型的地址,這個list第0項是記錄的ip,第1項是記錄的連接埠號碼。

  6.之後用戶端會通過send(),sendall()等方法發送具體的資料給服務端,後續服務端與用戶端會通過accept()返回的新socket對象來通訊。這個新的socket對象要放在一個之前的while True迴圈下的一個新的while True迴圈來使用recv()擷取訊息。(recv(),send(),sendall())

  

  用戶端:

  1.用戶端建立一個socket對象。(socket())

  2.用戶端發起一個串連請求。(connect())  ====>對應服務端的4.

  3.用戶端發送資料。(send(),sendall())    ====>對應服務端的6.

 

  通訊的過程如上所述,但是還需要注意一些細節。socket通訊通過byte來傳遞,字串需要通過encode()編碼成byte型才能傳輸。接收端需要將byte通過decode()解碼才能轉換為字串。如果要傳輸對象,則需要匯入pickle模組,通過pickle.dumps(object)來轉化為可以傳輸的類型,通過pickle.loads(object)來還原回對象。

  

  為了實現多用戶端串連的功能,需要引入多線程。每當一個用戶端發起串連時,就建立一個新的線程,這個線程就負責為這個用戶端進行通訊。這樣就可以支援多線程的通訊。userList是一個list,每當有用戶端串連到服務端,就會將這一對串連的socket添加到list當中。這樣之後該線程中接收到該用戶端發送的資訊後,會遍曆這個list的每個元素,實現向每一個用戶端轉寄該用戶端發送的訊息。

1 while True:2     conn, addr = socket_server.accept()3     # conn為新的socket對象,與伺服器串連後的後續操作由conn去處理4     userDict[conn] = addr5     userList.append(conn)6     thread = threading.Thread(target=newClientConnection, args=(conn, addr))7     thread.start()

  

1  while True:2         words_byte = conn.recv(1024)3         words = words_byte.decode()4         print(words)5         for c in userList:6             c.sendall(words.encode())

 

  為了實現用戶端可以接收其他用戶端發送的訊息,同時又可以多次發送新的訊息,需要建立兩個線程,一個是接收訊息的線程,一個是發送訊息的線程。

1 thread_send = threading.Thread(target=sendMessage, args=(socket_client, name))2 thread_send.start()3 thread_receive = threading.Thread(target=receiveMessage, args=(socket_client,))4 thread_receive.start()

 

def sendMessage(socket_client, name):    while True:        words = input()        message = name + "  :   " + words        socket_client.sendall(message.encode())

 

def receiveMessage(socket_client):    while True:        dataFromServer_byte = socket_client.recv(1024)        str = dataFromServer_byte.decode()        print(str)

 

  需要注意threading模組建立線程時,"target="需要填入函數名,"args="需要填入該函數的參數,並且是以元組的形式填入,如果只有一個參數,需要在該參數後加一個”,“。

  項目中Git知識的總結:

  擷取曆史提交代碼的版本

git log #查看曆史提交記錄和版本號碼git branch 新分支名 版本號碼 #建立新分支,並且該新分支即為版本號碼對應版本的代碼git checkout 新分支名#切換到該新分支            

  

  合并本地版本其他分支到master分支

git checkout mastergit merge 分支名

 

Python學習:Socket編程——多用戶端通訊聊天室

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.