当前位置: 首页 > 知识库问答 >
问题:

如何使用socket编程发送pygame屏幕

晁砚
2023-03-14

我试图使用套接字编程将我的pygame屏幕发送到另一台电脑,但客户端出现错误。py实际上在pygame的新版本中,所以为什么会发生这种情况我没有理解

Traceback(最近的调用最后):文件"webclient.py",第24行,在图像=pygame.image.fromstring(数据集,(320,240),"RGB")#转换接收到的图像从字符串值错误:字符串长度不等于格式和分辨率大小

在server.py

Traceback(最后一次调用): File"/home/gaurav/Desktop/Games_Project/panda.py",第35行,在Image=screen.blit(bg,(0,0))AtiniteError:'NoneType'对象没有属性'blit'

这是我的服务器。派克

import pygame
import socket
import os
import time
width=800
height=600
fps=60
port=5012
imgdir=os.path.join(os.path.dirname(__file__),"img")
serversocket =socket.socket(socket.AF_INET,socket.SOCK_STREAM)
serversocket.bind(("",port))
serversocket.listen(1)
pygame.init()
clock=pygame.time.Clock()
screen=pygame.display.set_mode((width,height))
screen=pygame.display.set_caption("Game by Players")
bg = pygame.image.load(os.path.join(imgdir,"starfield.png")).convert()

running=True
while running:
    clock.tick(fps)
    for event in pygame.event.get():
    # check for closing window
        if event.type == pygame.QUIT:
            running = False
    connection, address = serversocket.accept()
    image = screen.blit(bg, (0, 0))
    pygame.display.flip()
    data = pygame.image.tostring(image, "RGB")  # convert captured image  to string, use RGB color scheme
    connection.sendall(data)
    connection.close()
 pygame.quit()

这是我的客户。派克

import socket
import pygame
import sys

host = "127.0.0.1"
port=5012
screen = pygame.display.set_mode((320,240),0)
while True:
    clientsocket=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    clientsocket.connect((host, port))
    received = []
# loop .recv, it returns empty string when done, then transmitted data is completely received
    while True:
        recvd_data = clientsocket.recv(230400)
    if not recvd_data:
        break
    else:
        received.append(recvd_data)

dataset = ''.join(received)
image = pygame.image.fromstring(dataset,(320,240),"RGB") # convert received image from string
screen.blit(image,(0,0)) # "show image" on the screen
pygame.display.update()

# check for quit events
for event in pygame.event.get():
    if event.type == pygame.QUIT:
        pygame.quit()
        sys.exit()

共有1个答案

贝杜吟
2023-03-14
Traceback (most recent call last): File "webclient.py", line 24,
in image = pygame.image.fromstring(dataset,(320,240),"RGB") # convert received image from string
ValueError: String length does not equal format and resolution size

我不确定你是否完全理解blit的工作。它会将图像推送到屏幕上的某个位置。它的返回值是一个pygame。Rect对象,但看起来您需要一个图像。

然后,你试图发送这个pyplay。Rect对象,将发生此错误,因为您的代码期待一个包含图像的字符串,但它接收到一个表示pyplay的字符串。Rect对象。

您似乎正在尝试发送bg图像。为此,请在服务器内部更改此代码。py:

data = pygame.image.tostring(image, "RGB")  # convert captured image  to string, use RGB color scheme

data = pygame.image.tostring(bg, "RGB")  # convert captured image  to string, use RGB color scheme
Traceback (most recent call last): File "panda.py", line 35,
in image = screen.blit(bg, (0, 0)) AttributeError: 'NoneType' object has no attribute 'blit'

请看以下几行:

screen=pygame.display.set_mode((width,height))
screen=pygame.display.set_caption("Game by Players")

在第一行中,您正确地创建了pyplay。要显示的表面。在第二行中,您正试图设置窗口标题。这就是错误发生的地方。看看这个函数的pyplay文档:

pygame.display.set_caption()
    Set the current window caption
    set_caption(title, icontitle=None) -> None

函数返回None!这意味着当您尝试调用screen时,屏幕现在等于None。blit,因此出现了错误。

要解决此问题,请更改此行:

screen=pygame.display.set_caption("Game by Players")

pygame.display.set_caption("Game by Players")
 类似资料:
  • Linux Socket 编程领域,为了处理大量连接请求场景,需要使用非阻塞 I/O 和复用。select、poll 和 epoll 是 Linux API 提供的 I/O 复用方式,自从 Linux 2.6 中加入了 epoll 之后,高性能服务器领域得到广泛的应用,现在比较出名的 Nginx 就是使用 epoll 来实现 I/O 复用支持高并发,目前在高并发的场景下,Nginx 越来越受到欢迎

  • 在很多底层网络应用开发者的眼里一切编程都是Socket,话虽然有点夸张,但却也几乎如此了,现在的网络编程几乎都是用Socket来编程。你想过这些情景么?我们每天打开浏览器浏览网页时,浏览器进程怎么和Web服务器进行通信的呢?当你用QQ聊天时,QQ进程怎么和服务器或者是你的好友所在的QQ进程进行通信的呢?当你打开PPstream观看视频时,PPstream进程如何与视频服务器进行通信的呢? 如此种种

  • 我做了一些研究,看看我是否可以用这种方式解决这个问题,但似乎没有找到任何解决我问题的方法。我发现了这两个问题:为什么我的pygame显示器没有显示任何东西?对为什么PyGame显示屏是黑屏感到困惑。我试图用评论中的建议来解决我的问题,但没有成功,或者问题的原因与我的不同。 当我运行代码时,pygame窗口会显示,但完全是黑色的,但不会调用任何错误。

  • 主要内容:服务端 socket 函数,客户端函数,完整实例,实例,实例Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。 本章节我们为大家接收 Perl 语言中如何使用 Socket 服务。 创建服务端 使用 socket 函数来创建 socket服务。 使用 bind 函数绑定端口。 使用 listen 函数监听端口。 使用 accept 函数接收客户端请求。 创建客户端 使用 sock

  • 主要内容:什么是 Sockets,简单的客户端,实例,简单的服务,实例,多客户端TCP服务,实例,微小的Web浏览器,实例,实例Ruby提供了两个级别访问网络的服务,在底层你可以访问操作系统,它可以让你实现客户端和服务器为面向连接和无连接协议的基本套接字支持。 Ruby 统一支持应用程序的网络协议,如FTP、HTTP等。 不管是高层的还是底层的。ruby提供了一些基本类,让你可以使用TCP,UDP,SOCKS等很多协议交互,而不必拘泥在网络层。这些类也提供了辅助类,让你可以轻松的对服务器进行读写

  • 背景 研究IPv6 socket编程原因: Supporting IPv6 in iOS 9</br> WWDC2015苹果宣布在ios9支持纯IPv6的网络服务,并且要求2016年提交到app store的应用必须兼容纯IPv6的网络,要求适配的系统版本是ios9以上(包括ios9)。 写这篇文章虽然是来源于iOS的需求,但是下面的内容除了特别说明外,大部分都适用于其他平台。</br> IPv6