Java 如何在不关闭套接字的情况下通知客户端数据已完成

Java 如何在不关闭套接字的情况下通知客户端数据已完成,java,android,sockets,loops,server,Java,Android,Sockets,Loops,Server,我在编写将位图作为数据传递的服务器-客户端通信时遇到问题 在我的服务器端,我有 InputStream in = rs.getBinaryStream(1); ByteArrayOutputStream f2 = new ByteArrayOutputStream(); int c = 0; while ((c = in.read()) > -1)

我在编写将位图作为数据传递的服务器-客户端通信时遇到问题

在我的服务器端,我有

InputStream in = rs.getBinaryStream(1);
                        ByteArrayOutputStream f2 = new ByteArrayOutputStream();
                        int c = 0;
                        while ((c = in.read()) > -1) {
                            f2.write(c);
                        }
                        bytes = f2.toByteArray();
                        username2.write(bytes, 0, bytes.length);
在我的Android客户端,我有

 ByteArrayOutputStream out = new ByteArrayOutputStream();
            final byte[] buffer = new byte[2048];
            int read = -1;

            while ((read = receiveimagem.read(buffer)) != -1) {
                out.write(buffer, 0, read);
            }

问题是,当我关闭服务器端的outputStream时,客户端只知道发送已经结束。但是这个结构在一个循环中,如果我关闭这个套接字,它就不会再工作了。我怎样才能告诉客户数据已经结束?这段代码同时在Android客户端中死机。我知道我应该发送长度并进行检查,但我不知道如何使用长度来检查文件的结尾。

将图像的长度传递给客户端的主要问题是服务器本身在开始传输图像之前不知道输入的长度。服务器应该首先将整个图像读入缓冲区,然后将缓冲区的长度发送给客户端。然后,客户机可以在for循环的条件下使用接收到的大小执行for循环。更好的解决方案是客户端在一次调用中读取所有图像,因此不需要在客户端中循环。通常可以而且应该避免一次执行一个字节的I/O。还记得刷新两个输出流

在一次通话中阅读并不能解决这个问题。读取一次只能传输一个字节。不能保证填充缓冲区。我已尝试通过bytes.lenght获取ByteArray大小,并将其发送到客户端。在客户端,在获得尺寸后,我如何为循环制作此文件?谢谢。读了你的话,我可以想出一个解决办法。刚刚为(int i=0,i@user3318082不需要一次读取一个字节。这几乎不能降低效率。您应该读取一个大小合理的字节数组,比如8k,并使用
read()返回的计数
告诉您实际读取了多少数据。有关如何在总体目标长度的控制下执行此操作,请参阅副本中的我的答案。