微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java:PrintWriter 是否提供了某种形式的关于请求源平台的首选行结尾的“线索”?

如何解决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 举报,一经查实,本站将立刻删除。