udp--- 使用者資料報協議(user datagram protocol),是乙個無連線的簡單的面向資料報的運輸層協議。
優點:傳輸速度快
缺點:不可靠
socket的中文意思是接外掛程式:
建立socket
在 python 中 使用socket 模組的類 socket 就可以完成:
socket.socket(addressfamily,type)
說明:函式 socket.socket 建立乙個 socket,返回該 socket的描述符,該函式帶有兩個引數:
udp服務端:
import
socket
# 1.
建立套接字
server_sock = socket.socket(socket.af_inet, socket.sock_dgram)
#2. bind
繫結ip
位址和埠,為元祖
tuple
型別#ip如果不指明,表示本機的任何乙個ip位址
server_addr = (
"",
8080
)server_sock.bind(server_addr)
while
true
:# recv
方法接收傳送過來的資料
# 返回值為接收到的資料,引數(這裡為
1024
)表示本次收取資料的最大位元組數
# receive_data = server_sock.recv(1024)
# recvfrom
與recv
方法類似,不同的是可以將傳送資料的客戶端的位址也返回
receive_data, client_addr =server_sock.recvfrom(
1024)#
注意python3
中收到的資料
receive_data
是bytes
型別# print(client_addr, ": ",receive_data)# 將
bytes
資料轉換為字串型別
msg = receive_data.decode(
"utf-8")#
將收到的資料顯示輸出
print(client_addr,
": "
, msg)
# 我們假定如果客戶端傳送了
quit
,我們就關閉服務端的套接字(即關閉服務端)
ifmsg ==
"quit"
:server_sock.close()
break
測試:# -u
表示使用
udp協議
# nc -u 伺服器ip 伺服器端口
nc -u
127.0
.0.1
8080
udp客戶端
import
socket
# 1.
建立套接字
client_sock = socket.socket(socket.af_inet, socket.sock_dgram) #
伺服器位址
server_addr = (
'127.0.0.1'
, 8080)
data = input(
"請輸入要傳送的內容:")
#只要使用者輸入的資料不為空,就向伺服器端傳送
while
data:
# 2.
使用sendto
方法向伺服器傳送資料
# sendto(bytes
型別要傳送的資料,
對方的位址
)client_sock.sendto(data.encode(
"utf-8"
),server_addr)
data = input(
"請輸入要傳送的內容:")
# 當使用者輸入的資料為空(
"")時
, 關閉客戶端套接字
client_sock.close() 測試
服務端與客戶端的程式我們都已完成,可以同時開啟進行測試。
我們也可以用nc充當udf服務端來單獨測試客戶端程式。
# -l
表示作為服務端開啟,進行監聽
listen
# -u表示使用udp協議
# nc-lu 繫結的伺服器ip位址 埠
nc -lu
127.0
.0.1
8080
網路程式設計中的廣播
import socket
# 建立
udp套接字
s = socket.socket(socket.af_inet, socket.sock_dgram)
# 告訴系統核心剛建立的套接字用來進行廣播
s.setsockopt(socket.sol_socket, socket.so_broadcast, 1)
data = input(
"請輸入要廣播的內容:")
while
data:
# 注意對於廣播物件位址的設定
# 表示廣播位址
s.sendto(data.encode(
"utf-8"
), (""
, 8080
))data = input(
"請輸入要廣播的內容:")
s.close()
udp總結
1.udp是傳輸層的一種協議,不需要進行連線就可以用來傳送和接收資料,但不保證資料的可靠傳輸。
2. udp伺服器、客戶端 1
、udp的伺服器和客戶端的區分:往往是通過
請求服務
和提供服務
來進行區分 2
、請求服務的一方稱為:客戶端 3
、提供服務的一方稱為:伺服器
3. udp繫結問題 1
、一般情況下,伺服器端,需要繫結埠,目的是為了讓其他的客戶端能夠正確傳送到此程序 2
、客戶端,一般不需要繫結,而是讓作業系統隨機分配,這樣就不會因為需要繫結的埠被占用而導致程式無法執行的情況
套接字程式設計 UDP通訊程式的編寫流程
套接字 socket程式設計就是網路通訊程式的編寫 網路通訊程式的編寫使用的都是套接字介面 我們可以把套接字理解為介於作業系統和使用者之間網路通訊的中間層面,通過這個介面可以訪問核心,實現網路通訊程式的編寫 網路通訊程式的編寫 tcp ip五層中應用層是面向程式設計師的一層,應用層的協議都是程式設計...
Linux網路程式設計(2) UDP客戶服務程式設計
udp,即使用者資料報協議,是一種無連線的傳輸層協議。如何利用套接字實現乙個udp通訊。其套接字程式設計流程圖如下 函式原型 ssize t recvfrom int s,void buf,size t len,int flags,struct sockaddr from,socklen t fro...
基於UDP協議的伺服器 客戶端程式
udp網路程式採用的通訊模型與tcp網路程式模型有很大的不同,具體見圖7 4所示。udp伺服器首先進行初始化操作 呼叫函式socket建立乙個資料報型別的套接字,函式bind將這個套接字與伺服器的公認位址繫結在一起。然後呼叫函式recvfrom接收udp客戶機的資料報。udp客戶機首先呼叫函式soc...