2012-03-13 16 views
0

Java TCPサーバーとAndroidクライアントを使用して、Android用の基本的なマルチプレイヤーゲームを作成しようとしています。問題は、TCPパケットを送信するときの速度が遅いことです。 Thread.sleep(100)を置くと動作します。Java TCPサーバー - Androidクライアントのパケット損失

サーバ側:

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

EDIT:クライアント側:

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

+0

クライアントコードが追加されました – musa

+0

BWitchedさんの提案している間にBufferedReaderを作成してください(真) – Sid

答えて

3

多分、鍵はBufferedReaderにあります。あなたはループしており、サーバーから何かが送信されたかどうかを確認するために常にBufferedReaderを作成します。データが検出されると、処理が開始されますが、データはそのまま残り、BufferedReaderにバッファされます。最初に検出されたデータを処理した後、再度BufferedReaderを作成しますが、以前に作成したBufferedReaderに既にバッファされていたすべてのデータはどうなりますか?多分それは失われたでしょう。

ループ外にBufferedReaderを作成してみることはできますか?

+0

ありがとうございます! – musa

0

それはパケットロスが、それは、ネットワークリソースの面で安価であるとして、TCPの代わりにUDPを使用可能です一方向プロトコルがある場合。私はこれがあなたのケースではないと思う。 TCPの場合は、基本的なフロー制御を実装します。ここで、クライアントは受信したパケットを確認し、そのIDをサーバに返送します。

クライアントとサーバーのコードは、client.sent(..)の実装方法と異なる場合があるため、修正する必要があります。いつでも接続を閉じて再オープンしますか?または何?

+0

私もUDPを使用しています(速度を動かすデータ用)が、確定したデータ(ログインまたはチャット用)にはTCPが必要です。 – musa

関連する問題