python用socket实现简易局域网UDP组播屏幕分享

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

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

发送方

import socket
import time
import win32api, win32con
from PIL import ImageGrab
from io import BytesIO


# 发送方
def Sender():
    group_ip = '239.0.0.1'
    group_port = 10000
    # 创建IPv4/UDP套接字
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    # 获取当前分辨率下的屏幕尺寸
    width = win32api.GetSystemMetrics(win32con.SM_CXSCREEN)
    height = win32api.GetSystemMetrics(win32con.SM_CYSCREEN)
    # 压缩时,大小变为一半
    w = width // 2
    h = height // 2
    while True:
        # 截屏 bbox=None表示截取全屏
        # img = ImageGrab.grab(bbox=None)
        img = ImageGrab.grab(bbox=(0, 0, width, height))
        img.thumbnail((w, h))
        # 图像压缩
        output_buffer = BytesIO()  # 建立二进制对象,在内存中读写
        # RGB格式压缩为JPEG格 式,quality: 保存图像的质量,1(最差)~100
        img.save(output_buffer, format='JPEG', quality=50)
        frame = output_buffer.getvalue()  # 获取二进制数据
        # 发送文件
        sock.sendto(frame, (group_ip, group_port))
        time.sleep(0.05)  # 加点延时更稳定。


if __name__ == "__main__":
    Sender()

接收方

import socket
import struct
import matplotlib.pyplot as plt
import matplotlib.image as image
from io import BytesIO


# 接收方
def Receiver():
    group_ip = '239.0.0.1'  # 组地址
    group_port = 10000  # 端口号
    # 创建IPv4/UDP套接字
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    # 获取本地ip 先获取主机名,在通过主机名获取ip
    local_ip = socket.gethostbyname(socket.gethostname())
    # 绑定端口
    sock.bind((local_ip, group_port))
    # socket.inet_aton  ip转为二进制
    # socket.INADDR_ANY 所有地址
    mreq = struct.pack("=4sl", socket.inet_aton(group_ip), socket.INADDR_ANY)
    # 加入组播组
    # 使用默认的IPV4组播接口
    sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
    while True:
        plt.clf()  # 清除上一幅图像
        data, addr = sock.recvfrom(65536)  # 接受数值大一点,防止被撑爆
        img = BytesIO(data)
        img = image.imread(img, format='jpeg')
        plt.imshow(img)
        plt.pause(0.05)  # 暂停0.05秒 这一句是实现动态更新的
        plt.ioff()  # 关闭画图的窗口


if __name__ == '__main__':
    Receiver()

演示:

简易屏幕共享演示

屏幕共享程序解说视频

  • 8
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
### 回答1: 使用 Pythonsocket 模块可以实现局域网内的通信。 下面是一个简单的示例代码: 服务端: ```python import socket HOST = '' PORT = 5000 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind((HOST, PORT)) s.listen(1) conn, addr = s.accept() print('Connected by', addr) while True: data = conn.recv(1024) if not data: break conn.sendall(data) conn.close() ``` 客户端: ```python import socket HOST = 'localhost' PORT = 5000 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((HOST, PORT)) s.sendall(b'Hello, world') data = s.recv(1024) print('Received', repr(data)) s.close() ``` 在以上代码中,服务端监听本地地址和端口,并且接收客户端的连接请求。客户端连接服务端后,发送数据并接收服务端返回的数据。可以根据自己的需求修改代码。 ### 回答2: Python中的socket编程可以用于在局域网实现网络通信。使用socket库可以在python程序中创建客户端和服务器端,使它们可以通过socket连接进行通信。 首先,服务器端需要创建一个socket对象并将其绑定到IP地址和端口号上。之后,服务器端可以使用socket对象的listen()方法来监听客户端的连接请求。一旦有客户端请求连接,服务器端可以使用socket对象的accept()方法来接受连接,并创建一个新的socket对象,用于与客户端进行通信。服务器端可以使用这个新的socket对象的send()和recv()方法来发送和接收数据。 客户端需要创建一个socket对象并将其连接到服务器的IP地址和端口号上。之后,客户端可以使用socket对象的send()和recv()方法来发送和接收数据。 在实际应用中,可以使用Pythonsocket库配合其他网络协议(如TCP或UDP)来实现各种功能,例如创建一个简单的聊天程序、传输文件等。 总结起来,Pythonsocket编程可以让程序在局域网实现网络通信,通过创建socket对象来创建客户端和服务器端,并使用socket对象的方法来进行数据传输。 ### 回答3: PythonSocket模块是用来实现网络通信的一种机制,可以用于在局域网内进行网络通信。使用Socket模块,我们可以创建一个服务器端和一个或多个客户端,它们之间可以进行双向数据交换。 在局域网中进行Socket通信时,服务器端首先通过指定一个IP地址和端口号来创建一个服务器Socket对象。然后,通过调用对象的bind()方法将服务器Socket对象与指定的IP地址和端口号绑定在一起。接着,服务器Socket对象通过调用listen()方法开始监听来自客户端的连接请求。 客户端通过创建一个客户端Socket对象,并指定连接的服务器的IP地址和端口号来连接到服务器端。客户端Socket对象通过调用connect()方法来与服务器Socket对象进行连接。 一旦服务器端和客户端建立连接,它们可以通过调用send()和recv()方法来进行数据发送和接收。服务器可以通过调用accept()方法接受客户端的连接请求,并通过调用send()方法向客户端发送数据。客户端可以通过调用recv()方法接收服务器端发送过来的数据。 在局域网内进行Socket通信可以方便地实现多台计算机之间的数据交换,例如可以通过局域网socket在不同计算机之间进行文件传输、网络聊天等。使用PythonSocket模块,我们可以简单快速地实现局域网内的网络通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值