gpt4 book ai didi

python - Pygame无法使用套接字

转载 作者:行者123 更新时间:2023-12-03 11:53:19 24 4
gpt4 key购买 nike

我用pygame,imageGrab和套接字创建了一个程序,但是它不起作用。它应该使用ImageGrab拍摄服务器的打印屏幕,将其转换为字符串,然后将其发送给客户端。但是,客户端在收到信息并将其转换为图像时会引发错误:

image = pygame.image.frombuffer(img, (800,600), "RGB")
ValueError: Buffer length does not equal format and resolution size

代码服务器
import sys, os, socket, pygame
from PIL import ImageGrab
from pygame.locals import *
print "streaming sever 0.1"
try:
socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

except socket.error:
print "Error creating socket"
sys.exit(1)

host = "127.0.0.1"
port = raw_input("Port:")

socket.bind((host, int(port)))
socket.listen(2)

socket2,client = socket.accept()
print "Client conectado: " + str(client[0]) + "\nPorta usada: " + str(client[1])


#Capture and send

while True:
img=ImageGrab.grab().resize((800,600))
img.tostring()
socket2.sendall(img)

socket2.close()

代码客户端
import sys, os, socket, pygame
from PIL import ImageGrab
from pygame.locals import *
print "streaming client 0.1"

pygame.init()

try:
s_client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print "streaming protocol started"
except socket.error:
print "Error creating socket"
sys.exit(1)

host = "127.0.0.1"
porta = raw_input("Port:")
q_bytes = raw_input("Enter the number of MBs to transfer: ")

t_bytes = 1024*1024*int(q_bytes)

try:
s_client.connect((host,int(porta)))
except socket.error:
print "Error connecting to: " + host
sys.exit(1)
print "Conectado!"



size = width, height = 800, 600
screen = pygame.display.set_mode(size)

num = 0

while True:
img = s_client.recv(t_bytes)
image = pygame.image.frombuffer(img, (800,600), "RGB")
screen.blit(image,(0,0))
pygame.display.flip()
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
os._exit(1)
#recebimento

s_client.close()

最佳答案

与套接字打交道的是,如果您打算继续使用相同的套接字连接,则必须确切知道收到的消息有多长时间。您似乎对q_bytes = raw_input("Enter the number of MBs to transfer: ")对此有所了解,但我们需要确切知道而不是最近的MB。有时,此信息在数据的开头发送,因此我们可以先读取它,然后知道何时停止读取。

异常(exception)是如果我们不再需要连接;我们只想要这张照片。在这种情况下,可以根据需要查询尽可能多的数据,最后我们将返回一个空字符串。

至于recv的max_bytes参数,这只是一个最大值-对我们强加了另一个与硬件相关的最大值,在我的测试中为1MB。

下面的代码一直在查询数据,由于没有更多数据而在接收到空字符串时停止,然后将所有收集到的数据合并为完整的字符串。

可以(应该)建立许多抽象级别,以使我们远离这些复杂性,但是下面的代码只是您自己的代码,正在工作,并删除了一些无关的部分。

客户端

import sys, os, socket, pygame
from pygame.locals import *

pygame.init()

s_client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

host = "127.0.0.1"
porta = 12350
t_bytes = 1024*1024*1

s_client.connect((host,int(porta)))
print "Conectado!"

size = width, height = 300, 500
screen = pygame.display.set_mode(size)

message = []
while True:
s = s_client.recv(t_bytes)
if not s:
break
else:
message.append(s)
full_s = "".join(message)
print 'string received size', len(full_s)
image = pygame.image.frombuffer(full_s, size, "RGB")
#image = pygame.image.fromstring(s, size, "RGB")
screen.blit(image,(0,0))
pygame.display.flip()
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
os._exit(1)
raw_input()

s_client.close()

Server.py
import sys, os, socket, pygame
from pygame.locals import *

socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = "127.0.0.1"
port = 12350
socket.bind((host, int(port)))
socket.listen(2)
socket2,client = socket.accept()
print "Client conectado: " + str(client[0]) + "\nPorta usada: " + str(client

img = Image.open('tiny.jpg').resize((300, 500))
s = img.tostring()
print 'size of string', len(s)
socket2.sendall(s)

socket2.close()

编辑:根据Mark的更正,len()调用以前是 __sizeof__()方法调用。 __sizeof__返回python对象的大小(以字节为单位),而不是字符串中的字节/字符数。

关于python - Pygame无法使用套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7622019/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com