如何解决Java:PrintWriter 是否提供了某种形式的关于请求源平台的首选行结尾的“线索”?
这大约是来自 Oracle JDK 8 的 java.io.PrintWriter
我编写了一个小测试,以确保某些 TCP 接口服务(我们不拥有此服务!)始终返回 CRLF 而没有其他任何内容。
但是,我注意到预期会失败的测试(仅包含 LF)正在通过...
在调试测试时,我看到响应很好(只有 CRLF) - 但是我们有一个用户抱怨他仍然收到 LF 的响应!
我目前的想法是:由于我使用的是 printWriter.println(query);
,因此 println()
类(尤其是 PrintWriter
部分!)中的 ln
正在提供我当前的 CRLF (我正在 Win10 机器上运行测试)并且服务器正在尝试保持良好状态,因此正在根据从源中收到的线索调整行尾。
- 我会委托一个linux测试盒,我会写一个简单的应用程序来证实我上面的猜想。但是,即使我设法找到了一些相关性(我会在这里更新),我仍然想与了解
PrintWriter
类的人确认,这确实是事物“定制”并导致服务器切换行尾组合...
例如:也许不是PrintWriter
,而是提供这条线索的机器的TcpIpService?因此,我在这里的相关性并没有指出不同响应的原因(即:这不是 Java,而是操作系统)
更新:在 linux 中尝试之前,我尝试将 println 更改为 print,但随后 buffReader.read()
(java.io.BufferedReader 方法)“卡住了”。
我还尝试将 println() 交换为 write() 和 flush() - read() 再次卡住。
我应该如何重构我正在使用的 println() 方法,以控制所提供的行尾?我希望能够模拟 CRLF、CR 和 LF。
更新:我包含了一个小程序来重现我感兴趣的部分。不幸的是,我距离获得一台 linux 机器以查看该程序的输出在 linux 下是否发生变化还差得很远:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.socket;
public class NewWhoisClient {
public static void main(String[] args) {
int portNumber = 43;
String whoisHostName = "213.248.242.76";
String query = "nic.beer";
Socket whoisSocket;
PrintWriter printWriter;
BufferedReader buffReader;
try {
whoisSocket = new Socket(whoisHostName,portNumber);
buffReader = new BufferedReader(
new InputStreamReader(whoisSocket.getInputStream())
);
printWriter =
new PrintWriter(whoisSocket.getoutputStream(),true);
} catch (IOException e) {
throw new AssertionError("Socket setup Failed",e);
}
try {
printWriter.println(query);
StringBuilder responseWIP = new StringBuilder();
int value;
while ((value = buffReader.read()) != -1) {
responseWIP.append((char) value);
}
String result = responseWIP.toString();
///
if (result.contains("\r\n")) {
System.out.println("Result contained CRLF");
} else {
System.out.println("Some other line ending or no CRLF at all");
}
///
} catch (Exception e) {
throw new AssertionError("Socket communication Failed",e);
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。