首页 > 解决方案 > 性能问题一旦有多个客户端连接到服务器

问题描述

我目前正在开发一款多人 Java 游戏。为了允许多个客户端同时播放,我创建了一个DatagramSocket服务器。

我的服务器的“协议”是这样工作的:

  1. 客户端向服务器发送更新。
  2. 服务器接收更新。
  3. 服务器创建一个新线程来处理更新。
  4. 新线程将包含需要呈现的内容的数据包发送回客户端。

第四步是通过以下方法实现的:

public void sendBack(InetSocketAddress address, ArrayList<RenderEntity> renderEntities) {
    Player p = this.clients.get(address);
    RenderPacket packet = new RenderPacket(renderEntities, p.getX(), p.getY());
    this.byteBuffer = packet.getBytes();
    DatagramPacket sendPacket = new DatagramPacket(this.byteBuffer, this.byteBuffer.length, address.getAddress(), address.getPort());
    try {
        this.socket.send(sendPacket);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

从我在自己的机器上测试的结果来看,这个“协议”的效果相对较好,但从我在网上看到的情况来看,我的“协议”的第四步是非常规的。一旦接收到更新,包含需要呈现的内容的数据包将发送到连接到服务器的所有客户端,而不是发送更新的客户端

为了尝试并实施此更改,我尝试使用以下方法:

public void sendToAll(ArrayList<RenderEntity> renderEntities) {
    try {
        for (InetSocketAddress address : this.clients.keySet()) {
            Player p = this.clients.get(address);
            RenderPacket packet = new RenderPacket(renderEntities, p.getX(), p.getY());
            byte[] data = packet.getBytes();
            DatagramPacket sendPacket = new DatagramPacket(data, data.length, address.getAddress(), address.getPort());
            this.socket.send(sendPacket);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

当只有一个客户端连接时,该sendToAll(renderEntities)方法效果很好,但一旦另一个客户端连接,客户端就会遇到许多性能问题,我不知道为什么。我相信问题与服务器无关,因为它仍然能够与客户端通信。

当多个客户端连接到服务器时,为什么会出现性能问题的一些可能原因是什么?

标签: javasocketsserverdatagram

解决方案


推荐阅读