java - InputStream 没有收到 EOF

标签 java android sockets inputstream

我正在尝试通过套接字将图像从我的安卓设备发送到我的电脑。问题是我计算机上的输入流读取了每个字节,但最后一组字节除外。我试过修剪字节数组并发送它,我多次手动将 -1 写入输出流,但输入流从未读取 -1。它只是挂起等待数据。我也试过不关闭流或套接字以查看是否是某种计时问题,但效果不佳。

客户端(安卓手机)

//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 设备的流或套接字关闭时连接重置。图片几乎已完全发送,但图片的最后一个像素是灰色的。我什至还尝试直接从套接字使用输出/输入流,而不是使用已经创建的 objectinputstream/objectoutputstream,但它仍然不起作用。

最佳答案

首先,我认为你误解了EOF(-1)的意思。这并不意味着服务器写了一个-1,它意味着服务器关闭了流。

我认为您的主要问题是服务器和客户端都在循环读取,但都没有达到关闭流的程度。它们陷入僵局 - 都在等待另一个先关闭。

您的客户:

Your client

您的服务器:

Your server

如果您知道您没有更多数据要写入,那么只需关闭流即可。

关于java - InputStream 没有收到 EOF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7622952/

相关文章:

java - SP 返回的结果集 - SQL Server - Java

java - Android:获取值/键位于 ArrayList<HashMap<String, String>> 中的整个数组

php - PHP套接字编程socket_read + socket_write()

python - 从头开始编码以太网桥

java - gwtupload 缺少工具

java - 以编程方式查找是否安装了 Android

android - 升级到 Android 插件 3.0 后 Gradle 构建失败

Android:切换键盘(输入法)

Python 套接字。操作系统错误: [Errno 9] Bad file descriptor

java - JMS和EJB中事务的正确使用