Hello,大家好。本期來和大家一起學(xué)習(xí)一下網(wǎng)絡(luò)編程UDP的相關(guān)知識。
基礎(chǔ)知識補(bǔ)充
ip
ip地址:用來在網(wǎng)絡(luò)中標(biāo)記一臺電腦,在本地局域網(wǎng)上是唯一的。
查看電腦ip地址:ipconfig(win)/ifconfig(linux/mac)
端口
端口:設(shè)備與外界通訊交流的出口
一共有65536個(0 - 65535) 端口
知名端口是眾所周知的端口號。范圍從0到1023
例如:443:HTTPS 80:HTTP ...
動態(tài)端口一般不固定分配某種服務(wù),而是動態(tài)分配。范圍是從1024到65535
TCP/IP協(xié)議
TCP/IP協(xié)議是一個協(xié)議簇。里面包括了很多協(xié)議,之所以命名為TCP/IP協(xié)議,是因?yàn)門CP、IP協(xié)議是兩個很重要的協(xié)議。
python網(wǎng)絡(luò)編程用的兩種協(xié)議:TCP、UDP通過這兩種協(xié)議將字節(jié)碼進(jìn)行網(wǎng)絡(luò)傳輸?shù)摹?/p>
Python編碼轉(zhuǎn)換
str->bytes:encode(編碼)
bytes->str:decode(解碼)
使用方式:
bytes.decode(encoding="utf-8", errors="strict")
str.encode(encoding="utf-8", errors="strict")
errors:錯誤的處理方案。
encoding:解碼編碼過程中使用的編碼(此處指“編碼方案”是名詞)
示例:
text = '我是文本'
bytesText = text.encode(encoding="utf-8", errors="strict")
print(bytesText) # b'\xe6\x88\x91\xe6\x98\xaf\xe6\x96\x87\xe6\x9c\xac'
strText = bytesText.decode(encoding="utf-8", errors="strict")
print(strText) # 我是文本
socket套接字
不同電腦上的進(jìn)程之間如何通信?
1臺電腦上是通過進(jìn)程號(PID)來唯一標(biāo)識一個進(jìn)程,但是在網(wǎng)絡(luò)中這是行不通的。
其實(shí)TCP/IP協(xié)議已經(jīng)幫我們解決了這個問題。
網(wǎng)絡(luò)層的“ip地址”可以唯一標(biāo)識網(wǎng)絡(luò)中的主機(jī),而傳輸層的“協(xié)議+端口”可以唯一標(biāo)識主機(jī)中的應(yīng)用進(jìn)程。
這樣利用ip地址+協(xié)議+端口就可以標(biāo)識網(wǎng)絡(luò)的進(jìn)程了,網(wǎng)絡(luò)中的進(jìn)程通信就可以利用這個標(biāo)志與其它進(jìn)程進(jìn)行交互。
什么是socket?
socket(簡稱 套接字)是進(jìn)程間通信的一種方式,它與其他進(jìn)程間通信的主要不同是:
它能實(shí)現(xiàn)不同主機(jī)間的進(jìn)程間通信,我們網(wǎng)絡(luò)上各種各樣的服務(wù)大多都是基于 socket 來完成通信的。
例如我們每天瀏覽的網(wǎng)頁、QQ 聊天、收發(fā) email 等等。

創(chuàng)建socket
套接字使用流程:
創(chuàng)建套接字
使用套接字收/發(fā)數(shù)據(jù)
關(guān)閉套接字
import socket
socket_ = socket.socket(AddressFamily, Type)
# AddressFamily: socket.AF_INET(用于Internet進(jìn)程之間通信)、socket.AF_UNIX(用于同一臺機(jī)器進(jìn)程間通信)
# Type:socket.SOCK_STREAM(tcp)、socket.SOCK_DGRAM(udp)
創(chuàng)建一個tcp socket(tcp套接字)
import socket
# 創(chuàng)建tcp的套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# ...這里是使用套接字的功能(省略)...
# 不用的時候,關(guān)閉套接字
s.close()
創(chuàng)建一個udp socket(udp套接字)
import socket
# 創(chuàng)建udp的套接字
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# ...這里是使用套接字的功能(省略)...
# 不用的時候,關(guān)閉套接字
s.close()
UDP協(xié)議
概念
UDP是一種無連接的傳輸層協(xié)議,不提供可靠性,傳輸量小,傳輸速度較快。

創(chuàng)建UDP客戶端
步驟:
創(chuàng)建客戶端套接字
發(fā)送/接收數(shù)據(jù)
關(guān)閉套接字
python代碼:
import socket
def main():
# 1.創(chuàng)建udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 可選(接收時的端口 ('',端口))
local_address = ('', 8080)
udp_socket.bind(local_address)
while True:
# 2.發(fā)送數(shù)據(jù)到指定的電腦
send_data = input('請輸入你要發(fā)送的數(shù)據(jù):')
udp_socket.sendto(send_data.encode('utf-8'), ('192.168.5.132', 6666))
if send_data == 'exit':
break
# 可選(接收對方發(fā)送的數(shù)據(jù))
recv_data = udp_socket.recvfrom(1024) # 1024表示本次接收的最大字節(jié)數(shù)
recv_msg = recv_data[0].decode('utf-8')
recv_address = recv_data[1]
print('當(dāng)前客戶端地址:{},當(dāng)前接受的信息是:{}'.format(recv_address, recv_msg))
# 3.關(guān)閉套接字
udp_socket.close()
if __name__ == '__main__':
main()
創(chuàng)建UDP服務(wù)端
創(chuàng)建客戶端套接字
綁定ip和端口
接收/發(fā)送數(shù)據(jù)
關(guān)閉套接字python代碼:
import socket
def main():
# 1.創(chuàng)建udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2.必須選擇接收時的ip和端口 (ip,端口)
local_address = ('192.168.5.132', 6666)
udp_socket.bind(local_address)
while True:
# 3.接收對方發(fā)送的數(shù)據(jù)
recv_data = udp_socket.recvfrom(1024)
recv_msg = recv_data[0].decode('utf-8')
recv_address = recv_data[1]
print('當(dāng)前客戶端地址:{},當(dāng)前接受的信息是:{}'.format(recv_address, recv_msg))
# 可選(發(fā)送數(shù)據(jù)到指定的電腦)
send_data = input('請輸入你要發(fā)送的數(shù)據(jù):')
udp_socket.sendto(send_data.encode('utf-8'), ('192.168.2.4', 8080))
if send_data == 'exit':
break
# 4.關(guān)閉套接字
udp_socket.close()
if __name__ == '__main__':
main()
實(shí)戰(zhàn)案例:
如果是兩臺電腦的話:
客戶端(192.168.2.4):
import socket
def main():
# 1.創(chuàng)建udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 可選(接收時的端口 ('',端口))
local_address = ('', 8080)
udp_socket.bind(local_address)
while True:
# 2.發(fā)送數(shù)據(jù)到指定的電腦
send_data = input('請輸入你要發(fā)送的數(shù)據(jù):')
udp_socket.sendto(send_data.encode('utf-8'), ('192.168.5.132', 6666))
if send_data == 'exit':
break
# 可選(接收對方發(fā)送的數(shù)據(jù))
recv_data = udp_socket.recvfrom(1024) # 1024表示本次接收的最大字節(jié)數(shù)
recv_msg = recv_data[0].decode('utf-8')
recv_address = recv_data[1]
print('當(dāng)前客戶端地址:{},當(dāng)前接受的信息是:{}'.format(recv_address, recv_msg))
# 3.關(guān)閉套接字
udp_socket.close()
if __name__ == '__main__':
main()
服務(wù)端(192.168.5.132):
import socket
def main():
# 1.創(chuàng)建udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2.必須選擇接收時的ip和端口 (ip,端口)
local_address = ('192.168.5.132', 6666)
udp_socket.bind(local_address)
while True:
# 3.接收對方發(fā)送的數(shù)據(jù)
recv_data = udp_socket.recvfrom(1024)
recv_msg = recv_data[0].decode('utf-8')
recv_address = recv_data[1]
print('當(dāng)前客戶端地址:{},當(dāng)前接受的信息是:{}'.format(recv_address, recv_msg))
# 可選(發(fā)送數(shù)據(jù)到指定的電腦)
send_data = input('請輸入你要發(fā)送的數(shù)據(jù):')
udp_socket.sendto(send_data.encode('utf-8'), ('192.168.2.4', 8080))
if send_data == 'exit':
break
# 4.關(guān)閉套接字
udp_socket.close()
if __name__ == '__main__':
main()
效果演示:

客戶端(192.168.2.4)

服務(wù)端(192.168.5.132)
如果是單臺電腦的話:
客戶端(192.168.2.4):
import socket
def main():
# 1.創(chuàng)建udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 可選(接收時的端口 ('',端口))
local_address = ('', 8080)
udp_socket.bind(local_address)
while True:
# 2.發(fā)送數(shù)據(jù)到指定的電腦
send_data = input('請輸入你要發(fā)送的數(shù)據(jù):')
udp_socket.sendto(send_data.encode('utf-8'), ('192.168.2.4', 6666))
if send_data == 'exit':
break
# 可選(接收對方發(fā)送的數(shù)據(jù))
# recv_data = udp_socket.recvfrom(1024) # 1024表示本次接收的最大字節(jié)數(shù)
# recv_msg = recv_data[0].decode('utf-8')
# recv_address = recv_data[1]
# print('當(dāng)前客戶端地址:{},當(dāng)前接受的信息是:{}'.format(recv_address, recv_msg))
# 3.關(guān)閉套接字
udp_socket.close()
if __name__ == '__main__':
main()
服務(wù)端(192.168.2.4):
import socket
def main():
# 1.創(chuàng)建udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2.必須選擇接收時的ip和端口 (ip,端口)
local_address = ('192.168.2.4', 6666)
udp_socket.bind(local_address)
while True:
# 3.接收對方發(fā)送的數(shù)據(jù)
recv_data = udp_socket.recvfrom(1024)
recv_msg = recv_data[0].decode('utf-8')
recv_address = recv_data[1]
print('當(dāng)前客戶端地址:{},當(dāng)前接受的信息是:{}'.format(recv_address, recv_msg))
# 可選(發(fā)送數(shù)據(jù)到指定的電腦)
# send_data = input('請輸入你要發(fā)送的數(shù)據(jù):')
# udp_socket.sendto(send_data.encode('utf-8'), ('192.168.2.4', 8080))
# if send_data == 'exit':
# break
# 4.關(guān)閉套接字
udp_socket.close()
if __name__ == '__main__':
main()
效果演示:

客戶端(192.168.2.4)

服務(wù)端(192.168.2.4)
下篇文章我們來一起探討一下TCP。文章來源:http://www.zghlxwxcb.cn/news/detail-776608.html
(劇透:下篇文章更精彩好玩哦?。?/span>文章來源地址http://www.zghlxwxcb.cn/news/detail-776608.html
到了這里,關(guān)于Python網(wǎng)絡(luò)編程之UDP協(xié)議的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!