чтение строк из Java-сокета с несовместимыми ограничителями - PullRequest
0 голосов
/ 01 января 2012

Я использую BufferedReader # readLine () для получения текстовых строк из сокета TCP / IP.

Во время того же сеанса мой сервер иногда отправляет строки, оканчивающиеся на \ r \ n, а иногда отправляет строки, оканчивающиеся только на \ n.

Это поведение не под моим контролем: (

Javadoc для readLine () говорит:

"Строка считается завершенной любым из перевода строки ('\ n'), возврата каретки ('\ r') или возврата каретки, за которым сразу следует перевод строки."

К сожалению, это, похоже, не работает (по крайней мере, в Windows). Он только «знает» читать строки, заканчивающиеся на \ r \ n.

Есть предложения?

Заранее спасибо, Адриан.

Ответы [ 2 ]

1 голос
/ 03 января 2012

Написал простой сокет-клиент и протестирован на сервере netcat. Проблема в том, что сервер netcat всегда отправляет UTF-8, а клиент не может ожидать UTF-16, например.

Вот код клиента:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.UnknownHostException;

public class LineReader {

    /**
     * @param args
     */
    public static void main(String[] args) {
        if (args.length < 2) {
            System.out.println("usage: java LineReader charset url");
            System.exit(1);
        }

        try {
            final String charset = args[0];
            final URI url = new URI(args[1]);
            final String host = url.getHost();
            final int port = url.getPort();
            final Socket socket = new Socket(host, port);
            final BufferedReader reader = new BufferedReader(
                    new InputStreamReader(socket.getInputStream(), charset));
            while (true) {
                final String line = reader.readLine();
                System.out.println(line);
            }
        } catch (URISyntaxException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

Итог: нет проблем с методом readLine.

0 голосов
/ 01 января 2012

Попробуйте использовать свойство line.separator основной ОС: вы можете сделать это следующим образом:

static final String lineSeparator = System.getProperty ( "line.separator" );
...