微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

服务器发送速度快于客户端可以接收

如何解决服务器发送速度快于客户端可以接收

我的服务器发送对象的速度比客户端接收的快得多。这就是客户端接收 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))
            self.warte_text.update(bg_surface)
        except:
            pass

解决方法

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?