Чтение строк из сокета Java с несовместимыми ограничителями строки
Я использую BufferedReader#readLine(), чтобы получить текстовые строки из сокета TCP/IP.
Во время той же сессии мой сервер иногда отправляет строки, оканчивающиеся на \ r \ n, а иногда он отправляет строки, оканчивающиеся на \ n.
Это поведение не под моим контролем:(
Javadoc для readLine () говорит:
"Строка считается завершенной любым из перевода строки ('\n'), возврата каретки ('\r') или возврата каретки, за которым сразу следует перевод строки."
К сожалению, это не работает (по крайней мере, в Windows). Он только "знает" читать строки, заканчивающиеся на \ r \ n.
Любое предложение?
Заранее спасибо, Адриан.
2 ответа
Написал простой сокет-клиент и протестирован на сервере 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.
Попробуйте использовать свойство line.separator основной ОС: вы можете сделать это следующим образом:
static final String lineSeparator = System.getProperty ( "line.separator" );