linux中UDP程序流程、客户端、服务端
UDP--- 用戶數(shù)據(jù)報(bào)協(xié)議(User Datagram Protocol),是一個(gè)無連接的簡單的面向數(shù)據(jù)報(bào)的運(yùn)輸層協(xié)議。
?
優(yōu)點(diǎn):傳輸速度快
缺點(diǎn):不可靠
?
socket的中文意思是接插件:
?
創(chuàng)建socket
在 Python 中 使用socket 模塊的類 socket 就可以完成:
?
socket.socket(AddressFamily,Type)
說明:
函數(shù) socket.socket 創(chuàng)建一個(gè) socket,返回該 socket的描述符,該函數(shù)帶有兩個(gè)參數(shù):
- Address Family:可以選擇 AF_INET(用于 Internet 進(jìn)程間通信) 或者 AF_UNIX(用于同一臺機(jī)器進(jìn)程間通信),實(shí)際工作中常用AF_INET
- Type:套接字類型,可以是 SOCK_STREAM(流式套接字,主要用于 TCP 協(xié)議)或者 SOCK_DGRAM(數(shù)據(jù)報(bào)套接字,主要用于 UDP 協(xié)議)
-
?
udp服務(wù)端:
import socket
# 1. 創(chuàng)建套接字
server_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
#2. bind綁定ip地址和端口,為元祖tuple類型
#ip如果不指明,表示本機(jī)的任何一個(gè)ip地址
server_addr = ("", 8080)
server_sock.bind(server_addr)
while True:
??? # recv方法接收發(fā)送過來的數(shù)據(jù)
??? # 返回值為接收到的數(shù)據(jù),參數(shù)(這里為1024)表示本次收取數(shù)據(jù)的最大字節(jié)數(shù)
??? # receive_data = server_sock.recv(1024)
??? # recvfrom與recv方法類似,不同的是可以將發(fā)送數(shù)據(jù)的客戶端的地址也返回
??? receive_data, client_addr =server_sock.recvfrom(1024)
??? # 注意python3中收到的數(shù)據(jù)receive_data是bytes類型
??? # print(client_addr, ": ",receive_data)
??? # 將bytes數(shù)據(jù)轉(zhuǎn)換為字符串類型
??? msg = receive_data.decode("utf-8")
??? # 將收到的數(shù)據(jù)顯示輸出
??? print(client_addr, ": ", msg)
??? # 我們假定如果客戶端發(fā)送了quit,我們就關(guān)閉服務(wù)端的套接字(即關(guān)閉服務(wù)端)
??? if msg == "quit":
??????? server_sock.close()
??????? break
測試:
# -u 表示使用udp協(xié)議
# nc -u 服務(wù)器ip 服務(wù)器端口
nc -u 127.0.0.1 8080
?
udp客戶端
import socket
# 1. 創(chuàng)建套接字
client_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 服務(wù)器地址
server_addr = ('127.0.0.1', 8080)
data = input("請輸入要發(fā)送的內(nèi)容:")
#只要用戶輸入的數(shù)據(jù)不為空,就向服務(wù)器端發(fā)送
while data:
??? # 2. 使用sendto方法向服務(wù)器發(fā)送數(shù)據(jù)
??? # sendto(bytes類型要發(fā)送的數(shù)據(jù), 對方的地址)
??? client_sock.sendto(data.encode("utf-8"),server_addr)
??? data = input("請輸入要發(fā)送的內(nèi)容:")
# 當(dāng)用戶輸入的數(shù)據(jù)為空("")時(shí), 關(guān)閉客戶端套接字
client_sock.close()
測試
服務(wù)端與客戶端的程序我們都已完成,可以同時(shí)開啟進(jìn)行測試。
我們也可以用nc充當(dāng)udf服務(wù)端來單獨(dú)測試客戶端程序。
# -l 表示作為服務(wù)端開啟,進(jìn)行監(jiān)聽listen
# -u表示使用udp協(xié)議
# nc-lu 綁定的服務(wù)器ip地址 端口
nc -lu 127.0.0.1 8080
?
網(wǎng)絡(luò)編程中的廣播
import socket
# 創(chuàng)建udp套接字
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 告訴系統(tǒng)內(nèi)核剛創(chuàng)建的套接字用來進(jìn)行廣播
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
data = input("請輸入要廣播的內(nèi)容:")
while data:
??? # 注意對于廣播對象地址的設(shè)置
??? # <broadcast>表示廣播地址
??? s.sendto(data.encode("utf-8"), ("<broadcast>", 8080))
??? data = input("請輸入要廣播的內(nèi)容:")
s.close()
?
udp總結(jié)
1.udp是傳輸層的一種協(xié)議,不需要進(jìn)行連接就可以用來發(fā)送和接收數(shù)據(jù),但不保證數(shù)據(jù)的可靠傳輸。
2. udp服務(wù)器、客戶端
1、udp的服務(wù)器和客戶端的區(qū)分:往往是通過請求服務(wù)和提供服務(wù)來進(jìn)行區(qū)分
2、請求服務(wù)的一方稱為:客戶端
3、提供服務(wù)的一方稱為:服務(wù)器
3. udp綁定問題
1、一般情況下,服務(wù)器端,需要綁定端口,目的是為了讓其他的客戶端能夠正確發(fā)送到此進(jìn)程
2、客戶端,一般不需要綁定,而是讓操作系統(tǒng)隨機(jī)分配,這樣就不會(huì)因?yàn)樾枰壎ǖ亩丝诒徽加枚鴮?dǎo)致程序無法運(yùn)行的情況
總結(jié)
以上是生活随笔為你收集整理的linux中UDP程序流程、客户端、服务端的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java socket tomcat_在
- 下一篇: Linux常用的命令及操作技巧