創建一個udp客戶端程序的流程是簡單,具體步驟如下:
- 創建客戶端套接字
- 發送/接收數據
- 關閉套接字
UDP是面向無連接的通訊協議,UDP數據包括目的端口號和源端口號信息,由於通訊不需要連接,所以可以實現廣播發送。 UDP傳輸數據時有大小限制,每個被傳輸的數據報必須限定在64KB之內。 UDP是一個不可靠的協議,發送方所發送的數據報並不一定以相同的次序到達接收方。
UDP是一種面向無連接的協議,每個數據報都是一個獨立的信息,包括完整的源地址或目的地址,它在網絡上以任何可能的路徑傳往目的地,因此能否到達目的地,到達目的地的時間以及內容的正確性都是不能被保證的。但UDP操作簡單,而且僅需要較少的監護,因此通常用於局域網高可靠性的分散系統中client/server應用程序。例如視頻會議系統,並不要求音頻視頻數據絕對的正確,只要保證連貫性就可以了,這種情況下顯然使用UDP會更合理一些。
現在給大家展現一個關於服務端和客戶端的交互端口程序代碼如下,具體介紹在代碼中有詳細的注明:
'''
socket(簡稱 套接字) 是進程間通信的一種方式,它與其他進程間通信的一個主要不同是:
它能實現不同主機間的進程間通信,我們網絡上各種各樣的服務大多都是基於 Socket 來完成通信的
例如我們每天瀏覽網頁、QQ 聊天、收發 email 等等
'''
客戶端代碼:
from socket import *
# 發起udp請求 resSocket=socket(AF_INET,SOCK_DGRAM) # 要發送的地址,服務端地址 sendAddr=('192.168.8.195',8888) # 綁定本地端口 # ip地址和端口號,ip一般不用寫,表示本機的任何一個ip resSocket.bind(('192.168.8.195',6666)) #發送方也可以綁定 # resSocket.bind(bindAddr) n=10 while n>0: # 4. 發送數據到指定的電腦上 # 第一個參數是二進制對象,要將字符串轉換為二進制對象, # 需要使用encode方法,根據對方接收什么編碼,進行解碼。 sendData = input('請輸入客戶端要發送的數據:') # sendData要用encode('gbk')編碼成byte型 resSocket.sendto(sendData.encode('gbk'), sendAddr) # 接收服務端信息 recvData=resSocket.recvfrom(1024) # 發送的內容recvData[0].decode('gbk')要用decode進行解碼,解碼的類型和發送端編碼類型一致 print('發送方%s,端口號%s:%s'%(recvData[1][0],recvData[1][1],recvData[0].decode('gbk'))) n=n-1 resSocket.close()
服務端代碼:
from socket import * #1. 創建套接字 # 創建請求協議 # SOCK_DGRAM表示UDP協議,AF_INET表示ipv4 udpSocket=socket(AF_INET,SOCK_DGRAM) # 發送/接收數據 #2. 准備接收方的地址 # 准備要發送數據到的客戶ip地址,即客戶端 sendAddr=('192.168.8.195',6666) # 綁定本端口地址,服務端和客戶端ip地址可以一樣但是端口必須不一樣 udpSocket.bind(('192.168.8.195',8888)) n=10 while n>0: # 第一時間接收客戶端到信息, recvData=udpSocket.recvfrom(1024) # 輸出收到的信息 print('發送方:%s端口號:%s:%s'%(recvData[1][0],recvData[1][1],recvData[0].decode('gbk'))) # 3. 從鍵盤獲取數據 sendData = input('請輸入要發送的數據:') # 4. 發送數據到指定的電腦上:向客戶端發送數據 udpSocket.sendto(sendData.encode('gbk'), sendAddr) n=n-1 # 5關閉請求協議(關閉套接字) udpSocket.close()