Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用PIL和StringIO发送图像_Python_Sockets_Pygame_Python Imaging Library_Stringio - Fatal编程技术网

Python 使用PIL和StringIO发送图像

Python 使用PIL和StringIO发送图像,python,sockets,pygame,python-imaging-library,stringio,Python,Sockets,Pygame,Python Imaging Library,Stringio,我刚刚开始使用PIL、StringIO和Pygame,因此在获得想要的结果时遇到了一些麻烦。 我尝试制作一个屏幕共享软件,为了实现这一点,我需要能够将图像从一台计算机发送到另一台计算机,并使用Pygame在那里显示它。 这是服务器: #region - - - - - - I M P O R T S - - - - - - import socket import select from PIL import ImageGrab from PIL import Image from cStrin

我刚刚开始使用PIL、StringIO和Pygame,因此在获得想要的结果时遇到了一些麻烦。 我尝试制作一个屏幕共享软件,为了实现这一点,我需要能够将图像从一台计算机发送到另一台计算机,并使用Pygame在那里显示它。 这是服务器:

#region - - - - - - I M P O R T S - - - - - -
import socket
import select
from PIL import ImageGrab
from PIL import Image
from cStringIO import StringIO
import base64
#endregion
#region - - - - - - C O N S T A N T S - - - - - -
PORT = 8820
CONCURRENT_USERS = 5
#endregion

server_socket = socket.socket()
server_socket.bind(('', PORT))
server_socket.listen(CONCURRENT_USERS)
clients_list = []
while True:
    read, write, error = select.select([server_socket] + clients_list, [], [], 0)
    for i in read:
        if i is server_socket:
            client_socket, client_address = server_socket.accept()
            clients_list.append(client_socket)
        for i in clients_list:
            img = ImageGrab.grab()
            img_str = StringIO()
            img.save(img_str, "JPEG")
            try:
                i.send(base64.b64encode(img_str.getvalue()))
            except socket.error:
                clients_list.remove(i)
                i.close()
还有客户:

import socket
import pygame
import sys
from PIL import Image
from StringIO import StringIO
import base64
IP = '127.0.0.1'
PORT = 8820
client_socket = socket.socket()
client_socket.connect((IP, PORT))
WIDTH = 720
HEIGHT = 480
pygame.init()
size = WIDTH, HEIGHT
screen = pygame.display.set_mode(size)
count = 0
while True:
    count += 1
    for e in pygame.event.get():
        if e.type == pygame.QUIT:
            sys.exit()
    str_img = ''
    chunk = client_socket.recv(1024)
    while chunk:
        str_img += chunk
        chunk = client_socket.recv(1024)
    str_img = base64.b64decode(str_img)
    img = Image.open(str_img)
    screen.blit(img, (0, 0))
    screen.display.flip()
Pygame窗口不显示任何图像,并且在几秒钟后崩溃。 在使用StringIO之前,我尝试过几种方法,我尝试过使用Pickle,还有一些图像方法,但都不管用。
有人能发现这个问题吗?提前非常感谢

你可能会觉得有用。请注意,您必须从服务器调用shutdown或close以使recv在客户端中返回。不要从服务器发送“完成”,除非客户端也准备从接收的字节中删除“完成”。既然发送“done”没有任何好处,你也可以根本不发送它。我曾考虑过这样做,但我必须为每个图像重新打开套接字。这不会使整个过程慢很多吗?知道数据结束的最快方法是什么?在这种情况下,可以先发送字符串的大小,然后发送字符串本身。这样,客户机将知道需要多少字节。请参阅示例。还要注意,send和recv是。因此,您需要循环并检查以确保收到了正确的字节数。例如,请参见tdelaney的“获取”块和“发送”块。@unutbu这是绝对必要的吗?因为我正试图让整个过程尽可能快地进行,我感到震惊的是,这会让它慢很多。