首页 > 解决方案 > 服务器发送速度比客户端接收速度快

问题描述

我的服务器发送对象的速度比客户端接收的快得多。这就是客户端接收 10 秒前发送的对象的原因,因为客户端必须接收队列中的每个对象。所以我的问题是:我如何减慢服务器速度或让我的客户端接收速度更快?

编辑:我将 time.sleep(0.1) 添加到服务器但有更有效的方法吗?

这是我的网络课:

import socket
import pickle


class Network:
    def __init__(self):
        self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        self.server = "192.168.1.15"
        self.port = 5555
        self.addr = (self.server, self.port)
        self.player = self.connect()

    def get_player(self):
        return self.player

    def connect(self):
        try:
            self.client.connect(self.addr)
        except:
            pass

    def send_object(self, data):
        self.client.send(pickle.dumps(data))
    
    def get_object(self):
        return pickle.loads(self.client.recv(1024))
      

    def send_msg(self, data):
        self.client.send(bytes(data, "utf-8"))
        

    def get_msg(self):
        return self.client.recv(1024).decode("utf-8")

和我的服务器发送时:

p_count = conn.recv(1024).decode("utf-8")
        if p_count:
            
            games.append(Game(game_id, int(p_count), ip))
            game_id += 1
            while True:
                conn.send(pickle.dumps(games[-1]))

和我的客户收到时:

def update(self):
        global bg_surface
        try:
            self.game = n.get_object()
            self.player_in = self.game.players_ready
            bg_surface = pygame.image.load('./bilder/background3.jpg').convert()
            bg_surface = pygame.transform.scale(bg_surface, (screen_width, screen_height))
            self.warte_text = Label(f"Warte auf Spieler {self.player_in}/{self.player_amount}", 20, (screen_width // 2, screen_height // 2 * 0.25), (255, 0, 0))
            self.warte_text.update(bg_surface)
        except:
            pass

标签: pythonsocketsserverpygamepickle

解决方案


处理此问题的有效方法是让您的服务器在套接字上调用select()poll()以查明套接字何时在其传出数据缓冲区中有空间(并且可以选择阻塞直到有空间)并且只生成和send()当套接字指示它准备好写入时,将数据发送到套接字。这样,无论客户端读取速度有多慢,您的服务器线程都不会在等待客户端读取数据时被阻塞。


推荐阅读