翼度科技»论坛 编程开发 python 查看内容

python实现客户端和服务端的UDP相互通信

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
实验指南

这篇博客旨在实验客户端和服务端相互发送消息的实验,实验成功的现象为,客户端和服务端的两个窗口,即client和server左上角均被打上文字,因为客户端是没有给图片附上文字的功能的,十分感谢大佬提供源码上的支持
客户端代码
  1. import numpy as np
  2. import cv2
  3. from socket import socket, AF_INET, SOCK_DGRAM
  4. # 127.0.0.1表示本机的IP,用于测试,使用时需要改为服务端的ip
  5. addr = ('127.0.0.1', 8081)
  6. IP_ADDR = ('127.0.0.1', 8082)
  7. cap = cv2.VideoCapture(0)
  8. # 设置镜头分辨率,默认是640x480
  9. cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
  10. cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
  11. s = socket(AF_INET, SOCK_DGRAM)  # 创建UDP套接字
  12. s.bind(IP_ADDR)
  13. while True:
  14.     _, img = cap.read()
  15.     img = cv2.flip(img, 1)
  16.     # 压缩图片
  17.     _, send_data = cv2.imencode('.jpg', img, [cv2.IMWRITE_JPEG_QUALITY, 50])
  18.     s.sendto(send_data, addr)
  19.     print(f'正在发送数据,大小:{img.size} Byte')
  20.     # cv2.putText(img, "client", (50, 50),
  21.     #             cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)
  22.     # cv2.imshow('client', img)
  23.     try:
  24.         data, _ = s.recvfrom(921600)
  25.         print('info: ', _)
  26.         receive_data = np.frombuffer(data, dtype='uint8')
  27.         r_img = cv2.imdecode(receive_data, 1)
  28.         cv2.imshow('client', r_img)
  29.         if cv2.waitKey(1) & 0xFF == ord('q'):
  30.             break
  31.     except BlockingIOError as e:
  32.         pass
  33.     if cv2.waitKey(1) & 0xFF == ord('q'):
  34.         break
  35. s.close()
  36. cv2.destroyAllWindows()
复制代码
服务端代码
  1. from copy import deepcopy
  2. import numpy as np
  3. import cv2
  4. from socket import socket, AF_INET, SOCK_DGRAM
  5. s = socket(AF_INET, SOCK_DGRAM)  # 创建UDP套接字
  6. addr = ('0.0.0.0', 8081)  # 0.0.0.0表示本机
  7. s.bind(addr)
  8. s.setblocking(0)  # 设置为非阻塞模式
  9. while True:
  10.     data = None
  11.     try:
  12.         data, s_addr = s.recvfrom(921600)
  13.         print('[IP_INFO] {}'.format(s_addr))
  14.         receive_data = np.frombuffer(data, dtype='uint8')
  15.         r_img = cv2.imdecode(receive_data, 1)
  16.         r_img_1 = deepcopy(r_img)
  17.         r_img_2 = deepcopy(r_img)
  18.         cv2.putText(r_img_1, "server", (50, 50),
  19.                     cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)
  20.         cv2.imshow('server', r_img_1)
  21.         if cv2.waitKey(1) & 0xFF == ord('q'):
  22.             break
  23.         cv2.putText(r_img_2, "client", (50, 50),
  24.                     cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
  25.         _, send_data = cv2.imencode(
  26.             '.jpg', r_img_2, [cv2.IMWRITE_JPEG_QUALITY, 50])
  27.         s.sendto(send_data, s_addr)
  28.         print(f'正在发送数据,大小:{r_img.size} Byte')
  29.     except BlockingIOError as e:
  30.         pass
  31. cv2.destroyAllWindows()
复制代码
实验历程

假设服务端代码放在server.py的文件中,先打开一个终端
  1. python server.py
复制代码
假设客户端代码放在client.py的文件中,再打开一个终端,输入
  1. python client.py
复制代码
实验成功的现象

客户端和服务端的两个窗口,即client和server左上角分别被打上client和server的字样,因为客户端是没有给图片附上文字的功能的

来源:https://www.cnblogs.com/FallMax/p/17155441.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具