• 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()

    演示:

    简易屏幕共享演示

    屏幕共享程序解说视频

  • 相关阅读:
    ES6 入门教程 6 正则的扩展 6.7 RegExp.prototype.flags 属性 & 6.8 s 修饰符:dotAll 模式 & 6.9 后行断言
    android 消除字体上下间距
    VirtualBox设置共享文件夹步骤及遇到的问题
    深圳xxx公司测试岗位企业面试题
    PCB沉金包边工艺流程与主要作用经验总结
    Quartus Ⅱ调用FIFO IP核方法实现求和(Mega Wizard)
    卷积神经网络研究综述 学习记录
    08.29web自动化测试
    数据可视化——使用echars图表展示
    HTML5学习系列之标题和正文、描述性信息
  • 原文地址:https://blog.csdn.net/weixin_58196051/article/details/128077509