Java-сокет клиента с использованием writeBytes - PullRequest
2 голосов
/ 18 февраля 2012

Я читаю строку из буфера и записываю ее на сервер. У меня проблема в том, что строка никогда не получает сервер, когда я оставляю сокет открытым и пишу в цикле. Когда я использую это:

    try {       
        Socket send = new Socket("localhost", 1490);
        DataOutputStream out = new DataOutputStream(send.getOutputStream());
        String message = null;
        while ((message = buffer.get()) != null){
            out.writeBytes(message);
        }
        out.close();
        send.close();
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

сервер не получает строку, но когда я делаю это, он работает правильно:

    try {       

        String message = null;
        while ((message = buffer.get()) != null){
            Socket send = new Socket("localhost", 1490);
            DataOutputStream out = new DataOutputStream(send.getOutputStream());
                    out.writeBytes(message);
            out.close();
            send.close();
        }

    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

Очевидно, я не хочу продолжать открывать и закрывать сокет. В чем проблема?

Ответы [ 3 ]

1 голос
/ 18 февраля 2012

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

0 голосов
/ 18 февраля 2012

Позвольте мне сделать предположение.

Блокирует ли метод buffer.get() метод?Если это так, то проблема в том, что out.writeBytes(message) не гарантирует, что полное представление байтов будет отправлено на сервер.Вместо.есть большая вероятность, что ваш клиент имеет буферизованные байты, ожидающие очистки на сервере.

Если это происходит, то вызов flush после каждого вызова writeBytes решит проблему.

Но если метод buffer.get() не блокируется, то вызов flush не будет иметь никакого значения.Фактически это только увеличит сетевой трафик.Поэтому добавление сброса «на всякий случай» - плохая идея.


Другая возможность состоит в том, что что-то не так с кодом на стороне сервера.

0 голосов
/ 18 февраля 2012

Данные не записываются в сокет, даже когда вы его закрываете? (в вашем первом фрагменте)

Кроме того, вы пытались использовать метод flush ? Вы можете прочитать об этом здесь: http://docs.oracle.com/javase/1.4.2/docs/api/java/io/DataOutputStream.html#flush() и ваш код будет выглядеть так:

try {       
    Socket send = new Socket("localhost", 1490);
    DataOutputStream out = new DataOutputStream(send.getOutputStream());
    String message = null;
    while ((message = buffer.get()) != null){
        out.writeBytes(message);
        out.flush();
    }
    out.close();
    send.close();
} catch (IOException ex) {
    ex.printStackTrace();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...