2012-10-27 54 views
0

我正在做一个基于客户端 - 服务器的游戏,但在服务器有时与发送数据包的问题。在插座发送完成包

每个连接的客户端向服务器都有自己的实例(类名Peer)。此实例有一个名为buffer的变量ByteBuffer。同级类是一个Runnable,所以每个客户都有自己的线程。

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

在在同行类的螺纹while-loop每一个刻度,在字节缓冲区的所有数据包将被sended到客户端。但是有时在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); 

我怎样才能确保它发送数据包完成?

回答

0

使用生产者 - 消费者模式,以字节缓冲区队列和一个单独的线程来发送数据包。 确保每个生产者线程都有它自己的ByteBuffer,并且每个ByteBuffer只在完成后放入队列中。