性能问题一旦有多个客户端连接到服务器

时间:2019-03-23 15:35:55

标签: java sockets server datagram

我目前正在从事多人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();
    }
}

根据我在自己的计算机上测试的结果,此“协议”相对较好,但是从网上看到的“协议”的第4步是非常规的。收到更新后,将包含需要呈现内容的数据包发送到与服务器连接的所有客户端的所有,就像发送更新的客户端一样。

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

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)方法非常有效,但是一旦另一个客户端连接,则该客户端会遇到许多性能问题,我不知道为什么。我认为该问题与服务器无关,因为它仍然能够与客户端进行通信。

当一个以上的客户端连接到服务器时,为什么会出现性能问题?

0 个答案:

没有答案