Python 使用PIL和StringIO发送图像
我刚刚开始使用PIL、StringIO和Pygame,因此在获得想要的结果时遇到了一些麻烦。 我尝试制作一个屏幕共享软件,为了实现这一点,我需要能够将图像从一台计算机发送到另一台计算机,并使用Pygame在那里显示它。 这是服务器: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
#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这是绝对必要的吗?因为我正试图让整个过程尽可能快地进行,我感到震惊的是,这会让它慢很多。