我正在使用 BufferedReader#readLine() 从 TCP/IP 套接字获取文本行。
在同一 session 期间,我的服务器有时会发送以\r\n 结尾的行,有时会发送仅以\n 结尾的行。
这种行为不受我的控制:(
readLine() 的 Javadoc 说:
"A line is considered to be terminated by any one of a line feed ('\n'), a carriage return ('\r'), or a carriage return followed immediately by a linefeed."
不幸的是,这似乎不起作用(至少在 Windows 上)。它只“知道”读取以\r\n 结尾的行。
有什么建议吗?
提前致谢, 阿德里安。
最佳答案
编写了一个简单的套接字客户端并针对 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 方法没有问题。
关于java - 从java套接字读取行终止符不一致的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8694000/