java - 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() 方法返回的字节数少于数据的实际大小。我不知道如何解决这个问题,非常感谢您的帮助!(对不起,如果它这么长!)
解决方案
推荐阅读
- c - 如何降低文件 IO 程序的时间复杂度?
- sql - 使用 SQL 向 BigQuery 中的字段添加说明
- node.js - 在使用 node.js 的 vscode 中,ctrl+F5 总是要求“选择环境”。这在几周前没有发生
- flutter - 从 Firestore 获取地图并将其设置为新地图
- amazon-s3 - Aurora PostgreSQL 访问 s3 的权限
- python - api调用中不包含Django manytomany字段
- google-sheets - 如何在已发布的 Google 表格文档中显示不相邻的范围?
- android - 安卓。单击 RecyclerView 中的项目时加载 Intent
- python - 如何为不同键设置最小值的行的属性
- typescript - 基于派生类的初始化对象类型,其中在基类中执行初始化