2012-10-27 51 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只在完成後放入隊列中。