linux中UDP程序流程、客户端、服务端
UDP--- 用戶數據報協議(User Datagram Protocol),是一個無連接的簡單的面向數據報的運輸層協議。
?
優點:傳輸速度快
缺點:不可靠
?
socket的中文意思是接插件:
?
創建socket
在 Python 中 使用socket 模塊的類 socket 就可以完成:
?
socket.socket(AddressFamily,Type)
說明:
函數 socket.socket 創建一個 socket,返回該 socket的描述符,該函數帶有兩個參數:
- Address Family:可以選擇 AF_INET(用于 Internet 進程間通信) 或者 AF_UNIX(用于同一臺機器進程間通信),實際工作中常用AF_INET
- Type:套接字類型,可以是 SOCK_STREAM(流式套接字,主要用于 TCP 協議)或者 SOCK_DGRAM(數據報套接字,主要用于 UDP 協議)
-
?
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,我們就關閉服務端的套接字(即關閉服務端)
??? if msg == "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:
??? # 注意對于廣播對象地址的設置
??? # <broadcast>表示廣播地址
??? s.sendto(data.encode("utf-8"), ("<broadcast>", 8080))
??? data = input("請輸入要廣播的內容:")
s.close()
?
udp總結
1.udp是傳輸層的一種協議,不需要進行連接就可以用來發送和接收數據,但不保證數據的可靠傳輸。
2. udp服務器、客戶端
1、udp的服務器和客戶端的區分:往往是通過請求服務和提供服務來進行區分
2、請求服務的一方稱為:客戶端
3、提供服務的一方稱為:服務器
3. udp綁定問題
1、一般情況下,服務器端,需要綁定端口,目的是為了讓其他的客戶端能夠正確發送到此進程
2、客戶端,一般不需要綁定,而是讓操作系統隨機分配,這樣就不會因為需要綁定的端口被占用而導致程序無法運行的情況
總結
以上是生活随笔為你收集整理的linux中UDP程序流程、客户端、服务端的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java socket tomcat_在
- 下一篇: Linux常用的命令及操作技巧