首页 > 解决方案 > Java 输入流读取不完整

问题描述

我一直在研究 Java Web 服务器,并且我已经编写了大部分内容,现在我正在研究 TLS 和 HTTPS。问题是我从 SSLSocket 获得的输入流读取数据不完整。例如,如果数据的长度为 100,000 字节,它将仅读取 16,000 字节,即使输入流的 available() 方法返回错误的字节数。我尝试使用 readAllBytes() 方法或 readFully() 方法(DataInputStream)读取所有字节,但它们无法正常工作,因为它们会阻塞并等待接收更多字节。(我在处理 HTTP 时使用了 available() 方法来退出循环,它工作正常,但使用 HTTPS 它返回错误的字节数)。这是我创建服务器套接字的地方:

System.setProperty("javax.net.ssl.keyStore",SSLConfigs.getJKS());
System.setProperty("javax.net.ssl.keyStorePassword", SSLConfigs.getPass());
SSLServerSocketFactory sslServerSocketfactory = (SSLServerSocketFactory) 
SSLServerSocketFactory.getDefault();
SSLServerSocket sslServerSocket = (SSLServerSocket) 
sslServerSocketfactory.createServerSocket(Configs.getWSPort());
while (true) new HttpsHandler((SSLSocket) sslServerSocket.accept());

这是 HttpsHandler.java (这是我有问题的部分)。我将请求缓存在一个名为 tempFile 的文件中,并对其进行进一步处理:

FileOutputStream fw =  new FileOutputStream(tempFile,true);
fw.write(in.read());
while(in.available() > 0) {
fw.write(in.read());
}

如果这是一个问题,当我编写 HTTP 部分时,我必须从输入流缓冲区开始读取,以便 available() 方法不会返回 0,我在这里做同样的事情。所以基本上问题是我在这里编写的代码没有完全读取数据,当我进行一些调试时,我发现 available() 方法返回的字节数少于数据的实际大小。我不知道如何解决这个问题,非常感谢您的帮助!(对不起,如果它这么长!)

标签: javasslhttpswebserverinputstream

解决方案


推荐阅读