微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python - UDP 屏幕共享

如何解决Python - UDP 屏幕共享

我在传输 UDP 屏幕截图时遇到问题。我正在尝试通过 UDP 套接字不断传输屏幕截图以在另一侧显示它们(客户端发送图像,服务器显示它们)。我已经通过 TCP 实现了它,但是在 UDP 中使用它也很好。

代码服务器端

import socket
import threading
from zlib import decompress

import pygame

WIDTH = 1900
HEIGHT = 1000
host = '192.168.1.42'
port=5000

def reunitepixels(lst):
    data = ''
    for i in range(0,10):
        data =data + string.from_bytes(lst.pop(0),byteorder = 'big')
    bytedata = bytes(data,'utf-8')
    return bytedata

def recvall(UDPServerSocket,length):
    
    """ Retreive all pixels. """

    buf = b''
    while len(buf) < length:
        data = UDPServerSocket.recvfrom(length - len(buf))
        if not data:
            return data
        buf += data
    return buf

def ScreenShare(conn):
    pixels_lst =[] #list of byte chunks 
    pygame.init()
    screen = pygame.display.set_mode((950,500))
    clock = pygame.time.Clock()
    watching = True
    while watching:
        for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    watching = False
                    break
        # Retreive the size of the pixels length,the pixels length and pixels
        size_len = int.from_bytes(conn.recvfrom(1024),byteorder='big')
        size = int.from_bytes(recvall(conn,size_len),byteorder='big')
        for i in range(1,11):
            pixels_lst.append(conn.recvfrom(size))
        pixels = decompress(reunitepixels(pixels_lst),6)
        # Create the Surface from raw pixels
        img = pygame.image.fromstring(pixels,(WIDTH,HEIGHT),'RGB')
        # display the picture
        screen.blit(img,(0,0))
        pygame.display.flip()
        clock.tick(60)
def main():
    UDPServerSocket = socket.socket(family=socket.AF_INET,type=socket.soCK_DGRAM)
    UDPServerSocket.bind((host,port))
    try:
        print('Server started.')
        thread = threading.Thread(target=ScreenShare,args=(UDPServerSocket,))
        thread.start()
    finally:
        UDPServerSocket.close()


if __name__ == '__main__':
    main()

客户端

import socket
import zlib

import mss

WIDTH = 1900
HEIGHT = 1000
host = '192.168.1.42'
port=5000

LocalHost = ((host,port))

def split_img(seq,chunk,skip_tail=False):
    lst = []
    if chunk <= len(seq):
        lst.extend([seq[:chunk]])
        lst.extend(split_img(seq[chunk:],skip_tail))
    elif not skip_tail and seq:
        lst.extend([seq])
    return lst

def retreive_screenshot(sock):
    with mss.mss() as sct:
        # The region to capture
        rect = {'top': 0,'left': 0,'width': WIDTH,'height': HEIGHT}

        while True:
            sliced_image = []
            img = sct.grab(rect)
            pixels = zlib.compress(img.rgb,6)
            sliced_image = split_img(pixels,int(len(pixels)/10))
            break
            size = len(pixels)
            size_len = (size.bit_length() + 7) // 8
            sock.sendto(bytes([size_len]),LocalHost)

            # Send the actual pixels length
            size_bytes = size.to_bytes(size_len,'big')
            sock.sendto(size_bytes,LocalHost)
            # Send pixels
            for i in sliced_image:
                sock.sendto(sliced_image.pop(0),LocalHost)

def main():
    watching = True    

    UDPClientSocket = socket.socket(family=socket.AF_INET,type=socket.soCK_DGRAM)
    try:
        while 'connected':
            retreive_screenshot(UDPClientSocket)
    finally:
        UDPClientSocket.close()


if __name__ == '__main__':
    main()

我正在尝试将客户端的压缩字节变量“像素”拆分为多个块,然后将每个块发送到服务器端,服务器端会将它们“修复”在一起并形成完整的屏幕截图。

更新 我在发帖后看到我有一些以前从未见过的明显问题,因为它几乎立即崩溃了,因此它从未达到线程的功能。以上是最新的代码,它给出了错误 10038,我正在尝试修复 atm。尽管如此,帖子的原始问题仍然存在。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?