BufferedWriter и сокет в Java, запись не имеет никакого эффекта - PullRequest
1 голос
/ 26 ноября 2011

Я пишу небольшое клиентское приложение для связи с сервером. Я открываю сокет между моим клиентом и сервером и могу читать все, что выходит с сервера, с помощью BufferedReader. Это читается в ветке. Однако, когда я пишу в сокет с использованием BufferedReader, ничего не происходит! Нет исключения, но нет ответа от сервера (и он должен иметь ответ от сервера) Вот мой код:

socketWritter.write(message);
socketWritter.write("\n");
System.out.println(socketWritter.toString());
socketWritter.flush();

Мой сокет правильно открыт, и Mu BufferedWriter правильно инициализирован:

new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))

Понятия не имею, почему это не работает ?? Любая помощь будет отличной! Привет

Ответы [ 3 ]

14 голосов
/ 26 ноября 2011

Ваш код правильный. Я протестировал его с универсальным сервером, который будет отображать все, что отправляет клиент, и он работал нормально (без изменений). Возможно, ваш сервер неисправен. Одна вещь, которую я заметил, состояла в том, что для моего сервера мне нужно было добавлять символ новой строки каждый раз, когда я записывал в выходной поток, чтобы он действительно отправлял данные. Готов поспорить, поэтому ваш GUI ничего не получает. Вот класс клиентских потоков с моего сервера:

class ClientThread extends Thread {

    private Socket          sock;
    private InputStream     in;
    private OutputStream    out;

    ClientThread( Socket sock ) {
        this.sock = sock;
        try {
            this.in = sock.getInputStream();
            this.out = sock.getOutputStream();
        } catch ( IOException e ) {
            e.printStackTrace();
        }
    }

    //Echos whatever the client sends to it
    public void run() {
        BufferedReader bufIn = new BufferedReader( new InputStreamReader( in ) );
        BufferedWriter bufOut = new BufferedWriter( new OutputStreamWriter( out ) );
        while ( true ) {
            try {
                String msg = bufIn.readLine();
                System.out.println( "Received: " + msg );
                bufOut.write( msg );
                bufOut.newLine(); //HERE!!!!!!
                bufOut.flush();
            } catch ( IOException e ) {
                e.printStackTrace();
            }

        }
    }

}
1 голос
/ 26 ноября 2011

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

System.out.println(socketWritter.toString());

не скажет вам ничего полезного. Метод toString () только для объекта Stream, скорее всего, сообщает только имя класса объекта и его хэш-код. Это, конечно, не скажет вам, что вы написали в поток.

Учитывая это, нет четких доказательств того, что flush не сработал. (Проблема может быть на стороне сервера.)

0 голосов
/ 19 мая 2018

Используйте только OutputStreamWriter без BufferedWriter и используйте flush()

...