python3 下的Socket程式設計(TCP&UDP )
網路程式設計中最重要的兩個協議:TCP協議和UDP協議
TCP協議是網際網路中使用最廣泛的傳輸協議,這得益於其穩定,可靠的優勢。TCP協議是面向連線的傳輸協議,通訊雙方(通常是兩個主機上面的兩個程式)需要先建立連線,才能傳輸資料。資料在傳輸過程中會被分成多個小的資料包,這些資料包都會被新增上序號,全部達到接收端的小資料包會根據這些序號重新拼湊起來。TCP傳輸的資料包加入了檢驗碼,可以檢測在傳輸過程中資料包是否被更改過,對於更改過或者損失了資料的資料包,接收端會要求傳送端重新發送。接收端在收到傳送端傳送的資料包之後,會回送一個訊息到傳送端,告訴傳送端已經安全接收到資料包了,如果傳送端沒有收到這個回送訊息,則會經過一段時間再次傳送該資料包。因此在這種協議下面,資料的傳輸是十分穩定可靠的。
UDP協議是一類無連線的傳輸協議。傳送端只管將資料傳送出去,接收端收到資料後也不會發送回送訊息給傳送端,因此傳送端並不知道接收端有沒有收到完整的資料。TCP需要的時間和系統開銷都比UDP大,UDP在傳輸一些小資料時有一定的優勢,通常來說UDP一次傳輸的資料大小不能超過64kb,一般來說最佳的資料大小是<1kb。
python3可以使用socket模組簡單的實現TCP與UDP傳輸協議,下面看伺服器和客戶端程式碼
TCP傳輸的python3程式碼:
#伺服器端程式碼++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
測試程式碼時最好能用兩臺電腦測試。也可以像博主一樣在一臺電腦上面裝一個虛擬機器作業系統,使用橋接模式,也可以模擬客戶端和伺服器端完成端到端測試。
UDP傳輸的python程式碼:
#伺服器端++++++++++++++++++++++++++++++++++++++++++++++++
import socket BUFF_SIZE = 1024 server_addr = ('127.0.0.1', 55555) s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # SOCK_DGRAM是UDP傳輸協議 s.bind(server_addr) print('bind ok!') while True: data, addr = s.recvfrom(BUFF_SIZE) print(data) if data is 'bye': print('client has exit') break print('received:', data, " from", addr) s.close()
#客戶端+++++++++++++++++++++++++++++++++++++++++++++++++++++
import socket server_addr = ('127.0.0.1', 55555) s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) while True: msg = input('>') print(msg) s.sendto(msg.encode('utf-8'), server_addr) if msg is 'bye': break s.close()
UDP由於是無連線的傳輸協議,因此這裡建立的socket物件不需要呼叫connnect()方法建立連線,可以直接使用sendto()和recvfrom()來發送和接收資料。UDP協議並不可靠,傳送端不知道接受端有沒有收到資料,傳送端就只在傳送的時候傳送一次資料,如果網路擁塞很有可能造成接收端沒有正常接收到資料。TCP連線會多次重發資料,直到接收到來自接收方的回送訊息為止。