Клиент теряет несколько строк из сокета TCP - PullRequest
4 голосов
/ 22 декабря 2011

My ServerSocket записывает следующие строки:

OutputStreamWriter outstream = new OutputStreamWriter(clientSocket.getOutputStream());

BufferedWriter out = new BufferedWriter(outstream);

out.write("Hello");
out.newLine();
out.write("People");

out.flush();

И мой клиент читает это так:

in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
while(true){
    line = in.readLine();

    if(line == null){
        ClientDialog.gui.log.append("NULL LINE\r\n");
    } else{
        ClientDialog.gui.log.append(line+"\r\n");
    }

    if(in.readLine() == "SHUTDOWN"){
        break;
    }
}

Как видите, я пишу "Hello", aновая строка, а затем «People» в сокете, но когда я запускаю свой клиент, он только печатает «Hello» и повторно null.Я не вижу, что не так?


РЕШЕНА ПРОБЛЕМА:

Мне пришлось добавить out.newLine() после того, как я написал «People» в сокети я должен был сделать line == "SHUTDOWN" не in.readLine() == "SHUTDOWN", поскольку in.readLine() потреблял "People".

Также было рекомендовано использовать метод equals() в классе String вместо==.

Спасибо!

Это для будущих зрителей.

Ответы [ 4 ]

9 голосов
/ 22 декабря 2011

Вы вызываете readLine дважды за цикл.

if(in.readLine() == "SHUTDOWN"){
        break;
}

Код выше использует вашу строку "Люди"

чтобы исправить изменение на

if("SHUTDOWN".equals(line){
            break;
}

Также вы должны отправить новую строку после отправки "Люди"

3 голосов
/ 22 декабря 2011

Я почти уверен, что ваш in.readLine() == "SHUTDOWN" потребляет "людей" в потоке. Далее == тоже не сработает.

3 голосов
/ 22 декабря 2011

Это

    if(in.readLine() == "SHUTDOWN")
    {
        break;
    }

Должно быть так:

    if(line == "SHUTDOWN")
    {
        break;
    }

Вы дважды звоните readLine() и, следовательно, используете одну из своих линий

Кроме того, при сравнении типов String необходимо использовать метод equals() в классе String:

    if(line != null && line.equals("SHUTDOWN"))
    {
        break;
    }
1 голос
/ 22 декабря 2011

Вам нужно отправить еще одну новую строку после того, как вы отправите людей. Ваш вызов readLine ожидает, чтобы это сигнализировало его на обработку большего количества данных.

Попробуйте

out.write("Hello");
out.newLine();
out.write("People")
out.newLine();
...