簡體   English   中英

Java TCP服務器-Android客戶端數據包丟失

[英]Java TCP server - android client packet loss

我正在嘗試使用Java TCP服務器和Android客戶端為Android創建基本的多人游戲。 問題是發送TCP數據包時速度較慢。 當我放入Thread.sleep(100)時,它可以工作。

服務器端:

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

客戶端剛收到(〜3個數據包)
測試_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();
}

也許關鍵是在BufferedReader 您處於循環中,並不斷創建BufferedReader來檢查是否已從服務器發送了某些內容。 一旦檢測到數據,就可以開始處理它,但是數據一直在發送,並被緩存在BufferedReader 在處理了最初檢測到的數據之后,您將再次創建BufferedReader但是,對於之前創建的BufferedReader已經緩沖的所有數據,會發生什么? 也許迷路了。

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

如果它是單向協議,可以接受丟包,則使用UDP代替TCP,因為從網絡資源上講它更便宜。 我認為這不是您的情況。 如果是TCP,則實施基本的流控制,其中客戶端通過將其ID回顯到服務器來確認收到的數據包。

您還應該修改客戶端和服務器代碼,因為這種行為可能是您實現該client.sent(..) 您是否總是關閉並重新打開連接? 要不然是啥?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM