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

时间:2016-06-16 22:48:15

标签: java android sockets loops server

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

在我的服务器端,我有

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客户端。我知道我应该发送长度并检查它,但我不知道如何使用长度来检查文件的结尾。

1 个答案:

答案 0 :(得分:-1)

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