0

我正在制作基于客户端-服务器的游戏,但服务器有时会在发送数据包时出现问题。

每个连接到服务器的客户端都有自己的实例(类名Peer)。此实例有一个ByteBuffer名为 的变量buffer。对等类是 Runnable,因此每个客户端都有自己的线程。

服务器可以向客户端发送不同类型的数据包,数据包的第一个字节是“操作码”,以便客户端知道它是什么数据包。当客户端知道操作码时,它也知道数据包的大小。

在 Peer 类的线程中的每个滴答声中while-loop,ByteBuffer 中的所有数据包都将发送到客户端。但有时字节缓冲区中有一半数据包,因为另一个线程同时将字节放入其中。然后客户端读取操作码但缺少数据包的字节。

这是发送字节缓冲区中字节的 Peer 类的代码:

                ByteBuffer buffer = this.buffer.duplicate();
                this.buffer.clear();
                int size = buffer.position();
                buffer.flip();
                byte[] data = new byte[size];
                buffer.get(data);
                out.write(data);

如何确保它发送完整的数据包?

4

1 回答 1

0

使用生产者-消费者范式,带有一个 ByteBuffer 队列和一个单独的线程来发送数据包。确保每个生产者线程都有自己的 ByteBuffer,并且每个 ByteBuffer 仅在完成后放入队列。

于 2012-10-27T14:18:00.193 回答