python进阶__实现UDP通信
通信方式 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
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分。很多时候,情绪不稳是一个人前进路上的绊脚石。