Socket和pygame

0 投票
2 回答
2140 浏览
提问于 2025-04-18 03:57

我正在尝试写一个简单的游戏,但每次启动时,Pygame都会崩溃。

这是客户端的代码:

import socket, pygame, sys
port = 5000
host_server = "localhost"
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((host_server, port))
pygame.init()
FPS = 30
fpsClock = pygame.time.Clock()
DISPLAYSURF = pygame.display.set_mode((400, 300), 0, 32)
pygame.display.set_caption('Animation')
WHITE = (255, 255, 255)
catImg = pygame.image.load('cat.png')
dogImg = pygame.image.load('dog.png')
catx = 0
caty = 0
dogx = 0
dogy = 0
while True:
    tasto = pygame.key.get_pressed()
    DISPLAYSURF.fill(WHITE)
    dogx = client_socket.recv(1024)
    client_socket.send(str(catx))
    if tasto[K_RIGHT]:
        catx += 5
    elif tasto[K_DOWN]:
        caty += 5
    elif tasto[K_LEFT]:
        catx -= 5
    elif tasto[K_UP]:
    caty -= 5
    DISPLAYSURF.blit(catImg, (catx, caty))
    DISPLAYSURF.blit(dogImg, (dogx, dogy))
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    pygame.display.update()
    fpsClock.tick(FPS)

这是服务器的代码:

import pygame, sys, socket
from pygame.locals import *
host = "localhost"
port = 5000
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((host, port))
server_socket.listen(5)
pygame.init()
FPS = 30
fpsClock = pygame.time.Clock()
DISPLAYSURF = pygame.display.set_mode((400, 300), 0, 32)
pygame.display.set_caption('Animation')
WHITE = (255, 255, 255)
catImg = pygame.image.load('cat.png')
dogImg = pygame.image.load('dog.png')
catx = 0
caty = 0
dogx = 0
dogy = 0
while True:
    client_socket, address = server_socket.accept()
    tasto = pygame.key.get_pressed()
    DISPLAYSURF.fill(WHITE)
    dogx = client_socket.recv(1024)
    client_socket.send(catx)
    if tasto[K_RIGHT]:
        catx += 5
    elif tasto[K_DOWN]:
        caty += 5
    elif tasto[K_LEFT]:
        catx -= 5
    elif tasto[K_UP]:
        caty -= 5
    DISPLAYSURF.blit(catImg, (catx, caty))
    DISPLAYSURF.blit(dogImg, (dogx, dogy))
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    pygame.display.update()
    fpsClock.tick(FPS)

我知道我的代码看起来有点乱,但我刚学Python,想请你帮我解释一下我的错误。问题可能出在recv的大小上,但正如我说的,我对Python还不太熟悉,所以我想请你告诉我怎么计算消息的字节数(如果这真的是问题所在的话)。

2 个回答

1

我建议你去看看这个链接:http://stackoverflow.com/questions/17667903/python-socket-receive-large-amount-of-data。里面有一个被绿色勾勾标记的答案,值得一读。你可能遇到的问题是recv(1024)这个函数。需要记住的是,你创建的这些套接字是“阻塞”的。这意味着,如果你调用dogx = client_socket.recv(1024),但套接字没有接收到任何数据,那么这个函数会一直等下去,直到有数据传输到套接字为止,简而言之就是会等“永远”。另一个问题是缓冲区的大小。虽然看起来你的代码没有这个问题,但如果你尝试发送大量数据到套接字,你就需要多次调用client_socket.recv(1024),才能接收到完整的数据。可以参考我发的链接。

希望这对你有帮助!祝你好运!

2

你遇到的崩溃是什么情况?是有错误信息显示,还是程序就卡住了?

我能理解程序卡住的情况,因为你的服务器和客户端都是通过一个叫 recv 的命令开始交流的,但这个命令一直没有结果(也就是说,什么都没有发送过来)。

撰写回答