java – 没有接收EOF的InputStream
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 没有接收EOF的InputStream,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2018字,纯文字阅读大概需要3分钟。
内容图文
![java – 没有接收EOF的InputStream](/upload/InfoBanner/zyjiaocheng/760/fd5cd3ae330b4193993867fd91580396.jpg)
我试图通过套接字从我的Android设备发送图像到我的电脑.问题是我的计算机上的输入流读取每个字节但最后一组.我已经尝试修剪字节数组并发送它,我已经多次手动将-1写入输出流,但输入流从不读取-1.它只是挂起等待数据.我也尝试不关闭流或套接字,看看它是否是某种时序问题,但这并没有奏效.
客户端(Android手机)
//This has to be an objectoutput stream because I write objects to it first
InputStream is = An image's input stream android
ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
objectOutputStream.writeObject(object);
objectOutputStream.flush();
byte[] b = new byte[socket.getSendBufferSize()];
int read = 0;
while ((read = is.read(b)) != -1) {
objectOutputStream.write(b, 0, read);
objectOutputStream.flush();
b = new byte[socket.getSendBufferSize()];
}
//Tried manually writing -1 and flushing here
objectOutputStream.close();
is.close();
socket.close();
服务器端(计算机)这段代码发生在对象输入流读入发送的对象之后.它只在文件开始发送时才开始读取
File loc = Location of where the file is stored on the computer
loc.createNewFile();
FileOutputStream os = new FileOutputStream(loc);
Socket gSocket = The socket
ObjectInputStream gInputStream = Object Input stream created from the sockets input stream already used to read in the previous objects
byte[] b = new byte[gSocket.getReceiveBufferSize()];
int read = 0;
while ((read = gInputStream.read(b)) != -1) {
os.write(b, 0, read);
os.flush();
b = new byte[gSocket.getReceiveBufferSize()];
}
os.close();
即使我直接写入-1并刷新流,此代码也从不读入-1.结果是java.net.SocketException:当Android设备的流或套接字关闭时连接重置.图片几乎完全发送,但图片的最后一个像素是灰色的.我甚至尝试直接从套接字使用out / input流,而不是使用已经创建的objectinputstream / objectoutputstream,它仍然无法正常工作.
解决方法:
首先,我认为你误解了EOF(-1)的含义.这并不意味着服务器写了-1,这意味着服务器关闭了流.
我认为你的主要问题是服务器和客户端都在循环读取,并且都没有达到关闭流的程度.他们陷入僵局 – 两人都在等待另一人先关闭.
你的客户:
你的服务器:
如果您知道没有更多数据要写,那么只需关闭流即可.
内容总结
以上是互联网集市为您收集整理的java – 没有接收EOF的InputStream全部内容,希望文章能够帮你解决java – 没有接收EOF的InputStream所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。