java - Java Sockets - 接收空白缓冲区
问题描述
我在阅读InputStream
of 时得到了一个奇怪的结果Socket
。当我从我的程序发送数据时,我得到了一次有效的结果。当我从单独的程序中执行此操作时,我得到了有效的数据,但服务器继续读取相同的消息,即使我不发送任何内容,只要连接到一个套接字,我就会得到空数组。
in = socket.getInputStream();
out = socket.getOutputStream();
dIn = new DataInputStream(in);
while(this.isAlive()) {
try {
dIn.read(buffer);
StringBuilder builder = new StringBuilder();
for(int i = 0; i < buffer.length; i++) {
builder.append(buffer[i]).append(" ");
}
builder.append("\n");
System.out.println(builder.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
输出(仅连接到套接字):
0 0 0 0 0 0 0 0
解决方案
引用 javadoc 的read():
回报:
读入缓冲区的总字节数,如果由于到达流的末尾而没有更多数据,则为 -1。
您的代码根本没有检查该结果。您假设所有字节都已读取,但这根本不起作用(有时)。
换句话说:总是总是总是,当您调用某个read()
返回此类值的方法时,您的代码绝对必须检查结果以确保通过读取实际接收到(预期的)数据。
很可能,这是您的问题的一部分。但要确定的是,您需要使用更多信息来增强您的问题。
推荐阅读
- android - FragmentNavigator 为透明背景添加片段而不是替换
- asp.net - asp.net 验证不适用于用户控件内的验证组
- html - 如何使用超链接图像修复页脚移动
- sql-server - 在sql存储过程中查找创建日期和更新日期之间的最新日期
- mysql - 错误:无法添加或更新子行:外键约束失败
- c++ - 使用 Qt 4.8 在 QDockWidget 中添加的 QVBoxLayout 中重新定位小部件
- youtube-api - Google Cloud / API:通过多个项目规避配额
- templates - 当语法在 vue 组件中看起来很完美时,“外部根元素将被忽略”错误
- loops - 批量使用多个 for 循环
- html - 如何在 HTML 中显示数组元素(离子 3)