Java TCP-сервер - потеря пакета клиента Android - PullRequest
0 голосов
/ 13 марта 2012

Я пытаюсь создать базовую многопользовательскую игру для Android, используя сервер Java TCP и клиент Android.Проблема в медленной скорости при отправке пакетов TCP.Когда я ставлю Thread.sleep (100), он работает.

на стороне сервера:

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();
}

Ответы [ 2 ]

3 голосов
/ 14 марта 2012

Может быть, ключ в BufferedReader. Вы в цикле и постоянно создаете BufferedReader, чтобы проверить, было ли что-то отправлено с сервера. Как только данные обнаружены, вы начинаете их обрабатывать, но данные продолжают поступать и помещаются в буфер BufferedReader. После обработки первоначально обнаруженных данных вы снова создаете BufferedReader, но что происходит со всеми данными, которые уже были буферизованы в BufferedReader, созданном ранее? Может быть, это потеряно.

Не могли бы вы попытаться создать BufferedReader вне цикла?

0 голосов
/ 13 марта 2012

Если это односторонний протокол, в котором потеря пакетов приемлема, используйте UDP вместо TCP, поскольку он дешевле с точки зрения сетевых ресурсов. Я думаю, что это не ваш случай, однако. Если TCP, то реализуйте базовое управление потоком, где клиент подтверждает полученный пакет с передачей его идентификатора обратно на сервер.

Вам также следует пересмотреть свой клиентский и серверный код, поскольку это может быть таким же образом, как вы реализовали этот client.sent(..). Вы всегда закрываете и снова открываете соединение? Или что?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...