python网络编程——UDP通信附实例参考
簡(jiǎn)介
在網(wǎng)絡(luò)通信編程中,用的最多的就是UDP和TCP通信了,原理這里就不分析了,網(wǎng)上介紹也很多,這里簡(jiǎn)單列舉一下各自的優(yōu)缺點(diǎn)和使用場(chǎng)景
| UDP | 及時(shí)性好,快速 | 視網(wǎng)絡(luò)情況,存在丟包 | 與嵌入式設(shè)備通信,實(shí)時(shí)控制場(chǎng)景 |
| TCP | 丟包會(huì)自動(dòng)重發(fā),理論上不用擔(dān)心丟包問題 | 延時(shí)相對(duì)大一些 | 通信可靠性場(chǎng)景,比如IoT設(shè)備控制,狀態(tài)同步 |
例程一:UDP server端,UDP數(shù)據(jù)接收
#!/usr/bin/python3 # -*- coding: utf-8 -*-""" udp通信例程:udp server端,修改udp_addr元組里面的ip地址,即可實(shí)現(xiàn)與目標(biāo)機(jī)器的通信, 此處以單機(jī)通信示例,ip為127.0.0.1,實(shí)際多機(jī)通信,此處應(yīng)設(shè)置為目標(biāo)客戶端ip地址 """ __author__ = "River.Yang" __date__ = "2021/4/30" __version__ = "1.0.0"from time import sleep import socketdef main():# udp 通信地址,IP+端口號(hào)udp_addr = ('127.0.0.1', 9999)udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 綁定端口udp_socket.bind(udp_addr)# 等待接收對(duì)方發(fā)送的數(shù)據(jù)while True:recv_data = udp_socket.recvfrom(1024) # 1024表示本次接收的最大字節(jié)數(shù)# 打印接收到的數(shù)據(jù)print("[From %s:%d]:%s" % (recv_data[1][0], recv_data[1][1], recv_data[0].decode("utf-8")))if __name__ == '__main__':print("當(dāng)前版本: ", __version__)print("udp server ")main()代碼解析
例程二:UDP client端,UDP數(shù)據(jù)發(fā)送
#!/usr/bin/python3 # -*- coding: utf-8 -*-""" udp通信例程:udp client端,修改udp_addr元組里面的ip地址,即可實(shí)現(xiàn)與目標(biāo)機(jī)器的通信, 此處以單機(jī)通信示例,ip為127.0.0.1,實(shí)際多機(jī)通信,此處應(yīng)設(shè)置為目標(biāo)服務(wù)端ip地址 """__author__ = "River.Yang" __date__ = "2021/4/30" __version__ = "1.0.0"from time import sleep import socketdef main():# udp 通信地址,IP+端口號(hào)udp_addr = ('127.0.0.1', 9999)udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 發(fā)送數(shù)據(jù)到指定的ip和端口,每隔1s發(fā)送一次,發(fā)送10次for i in range(10):udp_socket.sendto(("Hello,I am a UDP socket for: " + str(i)) .encode('utf-8'), udp_addr)print("send %d message" % i)sleep(1)# 5. 關(guān)閉套接字udp_socket.close()if __name__ == '__main__':print("當(dāng)前版本: ", __version__)print("udp client ")main()例程三:多線程實(shí)現(xiàn)UDP數(shù)據(jù)收發(fā)
#!/usr/bin/python3 # -*- coding: utf-8 -*-""" python多線程通信 """ __author__ = "River.Yang" __date__ = "2021/3/24" __version__ = "1.0.0"from time import sleep import socket import threading# 定義全局變量 t1_count = 0 t2_count = 0def udp_received_hundle(s):global t1_countprint("this is thread 1 running")while True:t1_count += 1print("thread 1 第 %s 次運(yùn)行" % t1_count)recv_data = s.recvfrom(1024) # 1024表示本次接收的最大字節(jié)數(shù)# 打印接收到的數(shù)據(jù)print("[From %s:%d]:%s" % (recv_data[1][0], recv_data[1][1], recv_data[0].decode("utf-8")))def udp_send_hundle(s):global t2_countprint("this is thread 2 running")while True:t2_count += 1print("")print("thread 2 第 %s 次運(yùn)行" % t2_count)s.sendto(("Hello,I am a UDP socket for: " + str(t2_count)).encode('utf-8'), udp_addr)print("send %d message" % t2_count)print("")sleep(1)if __name__ == '__main__':print("當(dāng)前版本: ", __version__)# 初始化# udp 通信地址,IP+端口號(hào)udp_addr = ('127.0.0.1', 9999)udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 綁定端口:udp_socket.bind(udp_addr)# 定義線程thread_list = []t1 = threading.Thread(target=udp_received_hundle, args=(udp_socket, ))thread_list.append(t1)t2 = threading.Thread(target=udp_send_hundle, args=(udp_socket, ))thread_list.append(t2)for t in thread_list:t.setDaemon(True)t.start()for t in thread_list:t.join()print("exit all task.")print('all process end.')代碼解析
代碼運(yùn)行效果如下
當(dāng)前版本: 1.0.0 this is thread 1 running thread 1 第 1 次運(yùn)行 this is thread 2 runningthread 2 第 1 次運(yùn)行 send 1 message[From 127.0.0.1:9999]:Hello,I am a UDP socket for: 1 thread 1 第 2 次運(yùn)行thread 2 第 2 次運(yùn)行 send 2 message[From 127.0.0.1:9999]:Hello,I am a UDP socket for: 2 thread 1 第 3 次運(yùn)行thread 2 第 3 次運(yùn)行 send 3 message[From 127.0.0.1:9999]:Hello,I am a UDP socket for: 3 thread 1 第 4 次運(yùn)行thread 2 第 4 次運(yùn)行 send 4 message[From 127.0.0.1:9999]:Hello,I am a UDP socket for: 4 thread 1 第 5 次運(yùn)行thread 2 第 5 次運(yùn)行 send 5 message結(jié)語(yǔ)
udp通信比較復(fù)雜,但實(shí)際用起來(lái)并不難,這里只是拋轉(zhuǎn)引玉,給大家一個(gè)示例參考,在實(shí)際應(yīng)用過程中,涉及到復(fù)雜數(shù)據(jù)通信,還需要使用通信協(xié)議,協(xié)議收發(fā),解包等函數(shù),另外數(shù)據(jù)緩存也很關(guān)鍵,尤其是大數(shù)據(jù)量的情況下,通常會(huì)用到隊(duì)列相關(guān)知識(shí),這一部分就留給大家自行研究吧,有機(jī)會(huì)也可以講一講,如果這篇文章對(duì)你有用,不妨點(diǎn)贊關(guān)注,你的支持是我最大的動(dòng)力。
·
·
·
歡迎各位老鐵一鍵三連,本號(hào)后續(xù)會(huì)不斷更新樹莓派、人工智能、STM32、ROS小車相關(guān)文章和知識(shí)。
如果這篇文章對(duì)你有用,不妨點(diǎn)贊關(guān)注,你的支持是我最大的動(dòng)力
大家對(duì)感興趣的知識(shí)點(diǎn)可以在文章下面留言,我可以優(yōu)先幫大家講解哦
歡迎大家光臨我的淘寶小店【玩轉(zhuǎn)智能機(jī)器人】,會(huì)定期推出教程中使用的物美價(jià)優(yōu)的硬件,你的光臨就是對(duì)我的支持
原創(chuàng)不易,轉(zhuǎn)載請(qǐng)說(shuō)明出處。
總結(jié)
以上是生活随笔為你收集整理的python网络编程——UDP通信附实例参考的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 支配树学习
- 下一篇: 计算机玩游戏不能全屏,如果电脑游戏无法全