当前位置:   article > 正文

python用socket实现简易局域网UDP组播屏幕分享_一个在数据报套接字上发送的消息大于内部消息缓冲区或其他一些网络限制,或该用户

一个在数据报套接字上发送的消息大于内部消息缓冲区或其他一些网络限制,或该用户

这是局域网组播,所以不能跨网段共享,

如果出现[WinError 10040] 一个在数据报套接字上发送的消息大于内部消息缓冲区或其他一些网络限制,或该用户用于接收数据报的缓冲区比数据报小。请将发送端的19行20行(//2)改大,或者将29行quality=50改小

发送方

  1. import socket
  2. import time
  3. import win32api, win32con
  4. from PIL import ImageGrab
  5. from io import BytesIO
  6. # 发送方
  7. def Sender():
  8. group_ip = '239.0.0.1'
  9. group_port = 10000
  10. # 创建IPv4/UDP套接字
  11. sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
  12. sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  13. # 获取当前分辨率下的屏幕尺寸
  14. width = win32api.GetSystemMetrics(win32con.SM_CXSCREEN)
  15. height = win32api.GetSystemMetrics(win32con.SM_CYSCREEN)
  16. # 压缩时,大小变为一半
  17. w = width // 2
  18. h = height // 2
  19. while True:
  20. # 截屏 bbox=None表示截取全屏
  21. # img = ImageGrab.grab(bbox=None)
  22. img = ImageGrab.grab(bbox=(0, 0, width, height))
  23. img.thumbnail((w, h))
  24. # 图像压缩
  25. output_buffer = BytesIO() # 建立二进制对象,在内存中读写
  26. # RGB格式压缩为JPEG格 式,quality: 保存图像的质量,1(最差)~100
  27. img.save(output_buffer, format='JPEG', quality=50)
  28. frame = output_buffer.getvalue() # 获取二进制数据
  29. # 发送文件
  30. sock.sendto(frame, (group_ip, group_port))
  31. time.sleep(0.05) # 加点延时更稳定。
  32. if __name__ == "__main__":
  33. Sender()

接收方

  1. import socket
  2. import struct
  3. import matplotlib.pyplot as plt
  4. import matplotlib.image as image
  5. from io import BytesIO
  6. # 接收方
  7. def Receiver():
  8. group_ip = '239.0.0.1' # 组地址
  9. group_port = 10000 # 端口号
  10. # 创建IPv4/UDP套接字
  11. sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
  12. sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  13. # 获取本地ip 先获取主机名,在通过主机名获取ip
  14. local_ip = socket.gethostbyname(socket.gethostname())
  15. # 绑定端口
  16. sock.bind((local_ip, group_port))
  17. # socket.inet_aton ip转为二进制
  18. # socket.INADDR_ANY 所有地址
  19. mreq = struct.pack("=4sl", socket.inet_aton(group_ip), socket.INADDR_ANY)
  20. # 加入组播组
  21. # 使用默认的IPV4组播接口
  22. sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
  23. while True:
  24. plt.clf() # 清除上一幅图像
  25. data, addr = sock.recvfrom(65536) # 接受数值大一点,防止被撑爆
  26. img = BytesIO(data)
  27. img = image.imread(img, format='jpeg')
  28. plt.imshow(img)
  29. plt.pause(0.05) # 暂停0.05秒 这一句是实现动态更新的
  30. plt.ioff() # 关闭画图的窗口
  31. if __name__ == '__main__':
  32. Receiver()

演示:

简易屏幕共享演示

屏幕共享程序解说视频

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/156812
推荐阅读
相关标签
  

闽ICP备14008679号