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

pygame在套接字接收数据时停止响应

程举
2023-03-14
import socket
import pygame
import sys


IP = socket.gethostbyname(socket.gethostname())
PORT = 5555
Biended_adrs = (IP, PORT)
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(Biended_adrs)
server.listen()
conn, addr = server.accept()
print(f"{addr} connected!")

def Send(row, col):
    data = str((row, col))
    conn.send(data.encode())

def Receive():
    data = conn.recv(1024)
    return data.decode()




pygame.init()
display = pygame.display.set_mode((600, 600))
pygame.display.set_caption("Server")

GRAY = (100, 111, 111)
LineWidth = 10

def DrawLine():
    pygame.draw.line(display, GRAY, (0, 200), (600, 200), LineWidth) # h1
    pygame.draw.line(display, GRAY, (0, 400), (600, 400), LineWidth) # h2
    pygame.draw.line(display, GRAY, (200, 0), (200, 600), LineWidth) # v1
    pygame.draw.line(display, GRAY, (400, 0), (400, 600), LineWidth) # v2

DrawLine()


firstPlayer = conn.recv(1024)
player = firstPlayer.decode()

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

        if event.type == pygame.MOUSEBUTTONDOWN:
            mouseX = event.pos[0]
            mouseY = event.pos[1]


            clickedRow = int(mouseY // 200)
            clickedCol = int(mouseX // 200)


            if player == "1":
                try:
                    Send(clickedRow, clickedCol)
                    player = "2"
                    conn.send(player.encode())
                except Exception:
                    pass

            else:
                pass
        if player == "2":
            try:
                Clientdata = Receive()
                print(Clientdata, "Client Send!")
                player = conn.recv(1024).decode()
                print(player)
                receive = False
            except Exception:
                pass

        else:
            pass


        pygame.display.update()

client.py代码

import socket
import pygame
import sys

pygame.init()
display = pygame.display.set_mode((600, 600))
pygame.display.set_caption("Client")


HOST = socket.gethostbyname(socket.gethostname())
PORT = 5555

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((HOST, PORT))

draw = DrawLine()

def Send(row, col):
    data = str((row, col))
    client.send(data.encode())

def Receive():
    data = client.recv(1024)
    return data.decode()

GRAY = (100, 111, 111)
LineWidth = 10

def DrawLine():
    pygame.draw.line(display, GRAY, (0, 200), (600, 200), LineWidth) # h1
    pygame.draw.line(display, GRAY, (0, 400), (600, 400), LineWidth) # h2
    pygame.draw.line(display, GRAY, (200, 0), (200, 600), LineWidth) # v1
    pygame.draw.line(display, GRAY, (400, 0), (400, 600), LineWidth) # v2


firstPlayer = "1"
client.send(firstPlayer.encode())
player = "1"

while True:
    for event in pygame.event.get():
        If event.type == pygame.QUIT:
            sys.exit()

        if event.type == pygame.MOUSEBUTTONDOWN:
            mouseX = event.pos[0]
            mouseY = event.pos[1]
            clickedRow = int(mouseY // 200)
            clickedCol = int(mouseX // 200)

            if player == "2":
                try:
                    Send(clickedRow, clickedCol)
                    player = "1"
                    client.send(player.encode())
                except Exception:
                    pass


        if player == "1":
            try:
                data = Receive()
                print(data, "Server Send!")
                player = client.recv(1024).decode()
                print(player)
            except Exception:
                pass
        else:
            pass


        pygame.display.update()

共有1个答案

濮阳宁
2023-03-14

如果您查找文档:

https://docs.python.org/3/library/socket.html

socket.recv(bufsize[,flags])从套接字接收数据。返回值是一个bytes对象,表示接收到的数据。一次接收的最大数据量由bufsize指定。有关可选参数标志的含义,请参阅Unix手册页面recv(2);它默认为零。

conn.recv(1024, flags = socket.SOCK_NONBLOCK)
 类似资料:
  • 我有一个很奇怪的问题快把我逼疯了。 我有一个Ruby服务器和一个Flash客户端(动作脚本3)。这是一个多人游戏。 问题是,一切都在完美地工作,然后,突然,一个随机的球员停止接收数据。当服务器因为不活动而关闭连接时,大约20-60秒后,客户端接收到所有缓冲的数据。 null 我不认为这是一个操作系统/网络问题,因为我已经从一个位于西班牙的VPS换到了位于爱尔兰的亚马逊EC2,问题仍然存在。 我觉得

  • 我正在用C语言编写一个服务器,使用POSIX sockets api。 这是作为GUI应用程序的一部分运行的,它需要能够停止和启动服务器监听和向客户端发送数据。 服务器的主要部分基本上是这样的(我排除了很多代码,因为其中一些与这个问题无关。) 换句话说: 让套接字监听连接 为select()调用设置fds 使用stdin调用select(),所有连接客户端套接字,以及获取从GUI发送的任何数据的管

  • 我正在尝试用Java实现一个TFTP客户端。客户端在Localhost上运行良好,有时可以通过网络发送到TFTP服务器。然而,有时我的DatagramSocket会随机停止接收数据包。它将发送读/写请求,但永远不会收到服务器试图发送回的下一条消息。我已经检查了Wireshark,服务器确实在接收和尝试发送。防火墙在需要的地方被关闭。无法找出问题所在。以下是我正在使用的代码:

  • 因此,我正在用Java编写一个程序,在DatagramSocket和DataGramPacket的帮助下发送和接收数据。问题是,当我发送数据/接收数据时,数据在我发送的程序中也会有所不同,但只是在某些情况下,比如: 但有时会起作用,比如:

  • 当我尝试接收大量数据时,它会被切断,我必须按enter键才能获取其余数据。起初,我可以增加一点,但它仍然不会收到所有的。正如您所看到的,我增加了conn.recv()上的缓冲区,但它仍然无法获取所有数据。它会在某一点切断它。我必须在原始输入上按enter键才能接收其余数据。我是否可以一次获取所有数据?这是密码。

  • 我使用Android应用程序通过TCP套接字与同一局域网上的PC java应用程序进行通信、发送和接收消息。下面是我在android中使用的Asynctask的代码,用于发送消息并从PC接收回复: } 我在onPostExcecute中的祝酒词中显示PC的回复。 Android通过BufferedWriter发送消息,而PC上的java应用程序在BufferedReader中接收消息。 PC在收到