2012-03-13 90 views
0

我正嘗試使用Java TCP服務器和Android客戶端爲Android創建一個基本的多人遊戲。發送TCP數據包時速度慢。當我把Thread.sleep(100),然後它的作品。Java TCP服務器 - 安卓客戶端丟失

服務器側:

for(int i = 0; i<50; i++) { 
    client.send("test_" + i); 
} 

客戶剛收到(〜3數據包)
test_0
TEST_1

服務器與睡眠:接收

for(int i = 0; i<50; i++) { 
     client.send("test_" + i); 
     Thread.sleep(100); 
} 

客戶〜45

編輯:客戶端:

while (true) { 
if (!running) 
    break; 
inFromServer = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"), 2 * 1024); 
String rawRecervied = inFromServer.readLine(); 
if (rawRecervied == null) { 
    close(); 
    break; 
} 
final String recervied = rawRecervied.substring(2); // for skip utf bom chars 
new Thread() { 
    public void run() { 
     listener.dataRecervied(recervied); 
     Log.e("TCP recervied", recervied); // debug 
    } 
}.start(); 
} 
+0

可以粘貼客戶端代碼嗎? – Sid 2012-03-13 19:38:40

+0

添加客戶代碼 – musa 2012-03-13 19:58:00

+0

嘗試BWitched建議在創建BufferedReader之外的while(true) – Sid 2012-03-13 20:25:44

回答

3

也許鑰匙在BufferedReader。您處於循環狀態,並不斷創建BufferedReader以檢查是否從服務器發送了某些內容。一旦檢測到數據,就開始處理數據,但數據一直到來,並在BufferedReader中進行緩衝。處理最初檢測到的數據後,您再次創建BufferedReader,但是,之前創建的BufferedReader中已緩衝的所有數據會發生什麼?也許它丟失了。

你可以嘗試在循環外創建BufferedReader嗎?

+0

非常感謝! – musa 2012-03-13 20:29:12

0

如果它是一個單向協議,其中數據包丟失是可以接受的,然後使用UDP而非TCP因爲它是在網絡資源方面更便宜。但我認爲這不是你的情況。如果是TCP,那麼實現一個基本的流程控制,客戶端通過將其ID回送給服務器來確認接收到的數據包。

您還應該修改客戶端和服務器代碼,因爲此行爲可能與您實施client.sent(..)的方式相同。你總是關閉並重新打開連接?或者是什麼?

+0

我也使用UDP(對於移動數據的速度),但我想要達到的數據TCP(用於登錄或聊天)。 – musa 2012-03-13 19:53:10