zl程序教程

您现在的位置是:首页 >  Python

当前栏目

python进阶__实现UDP通信

2023-03-14 09:51:11 时间
通信方式优点缺点适用场景
UDP 及时性好,快速 视网络情况,存在丢包 与嵌入式设备通信,实时控制场景
TCP 丢包会自动重发,理论上不用担心丢包问题 延时相对大一些 通信可靠性场景,比如IoT设备控制,状态同步

 

 

 UDP服务端

 1 #!/usr/bin/python3
 2 # -*- coding: utf-8 -*-
 3 
 4 """
 5 udp通信例程:udp server端,修改udp_addr元组里面的ip地址,即可实现与目标机器的通信,
 6 此处以单机通信示例,ip为127.0.0.1,实际多机通信,此处应设置为目标客户端ip地址
 7 """
11 
12 from time import sleep
13 import socket
14 
15 
16 def main():
17     # udp 通信地址,IP+端口号
18     udp_addr = ('127.0.0.1', 9999)
19     udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# SOCK_DGRAM指的就是UDP通信类型
20     # 绑定端口
21     udp_socket.bind(udp_addr)
22 
23     # 等待接收对方发送的数据
24     while True:
25         recv_data = udp_socket.recvfrom(1024)  # 1024表示本次接收的最大字节数
26         # 打印接收到的数据
27         print("[From %s:%d]:%s" % (recv_data[1][0], recv_data[1][1], recv_data[0].decode("utf-8")))
28 
29 if __name__ == '__main__':
30 main()

UDP客户端

 1 #!/usr/bin/python3
 2 # -*- coding: utf-8 -*-
 3 
 4 """
 5 udp通信例程:udp client端,修改udp_addr元组里面的ip地址,即可实现与目标机器的通信,
 6 此处以单机通信示例,ip为127.0.0.1,实际多机通信,此处应设置为目标服务端ip地址
 7 """
12 
13 from time import sleep
14 import socket
15 
16 def main():
17     # udp 通信地址,IP+端口号
18     udp_addr = ('127.0.0.1', 9999)
19     udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
20 
21     # 发送数据到指定的ip和端口,每隔1s发送一次,发送10次
22     for i in range(10):
23         udp_socket.sendto(("Hello,I am a UDP socket for: " + str(i)) .encode('utf-8'), udp_addr)
24         print("send %d message" % i)
25         sleep(1)
26 
27     # 5. 关闭套接字
28     udp_socket.close()
29 
30 
31 if __name__ == '__main__':
32 main()

 

 多线程实现UDP数据收发

 1 #!/usr/bin/python3
 2 # -*- coding: utf-8 -*-
 3 
 4 """
 5 python多线程通信
 6 """
 7 
 8 from time import sleep
 9 import socket
10 import threading
11 
12 # 定义全局变量
13 t1_count = 0
14 t2_count = 0
15 
16 
17 def udp_received_hundle(s):
18     global t1_count
19     print("this is thread 1 running")
20     while True:
21         t1_count += 1
22         print("thread 1 第 %s 次运行" % t1_count)
23         recv_data = s.recvfrom(1024)  # 1024表示本次接收的最大字节数
24         # 打印接收到的数据
25         print("[From %s:%d]:%s" % (recv_data[1][0], recv_data[1][1], recv_data[0].decode("utf-8")))
26 
27 
28 def udp_send_hundle(s):
29     global t2_count
30     print("this is thread 2 running")
31     while True:
32         t2_count += 1
33         print("")
34         print("thread 2 第 %s 次运行" % t2_count)
35         s.sendto(("Hello,I am a UDP socket for: " + str(t2_count)).encode('utf-8'), udp_addr)
36         print("send %d message" % t2_count)
37         print("")
38         sleep(1)
39 
40 
41 if __name__ == '__main__':    # 初始化
44     # udp 通信地址,IP+端口号
45     udp_addr = ('127.0.0.1', 9999)
46     udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
47     # 绑定端口:
48     udp_socket.bind(udp_addr)
49 
50     # 定义线程
51     thread_list = []
52     t1 = threading.Thread(target=udp_received_hundle, args=(udp_socket, ))
53     thread_list.append(t1)
54     t2 = threading.Thread(target=udp_send_hundle, args=(udp_socket, ))
55     thread_list.append(t2)
56 
57     for t in thread_list:
58         t.setDaemon(True)
59         t.start()
60     for t in thread_list:
61         t.join()
62 
63     print("exit all task.")
64     print('all process end.')

 

 

 

 

 

职场上,你会沟通,加10分; 合作,加20分;会开拓资源 加50分;但如果你无法控制自己的情绪,不好意思,扣100分。很多时候,情绪不稳是一个人前进路上的绊脚石。