1

我创建了一个接受来自客户端的连接的服务器套接字,当建立连接时,使用写入字节的 OutputStream 将图像传输给它。我的问题是如何在关闭套接字连接之前检查 OutputStream 是否已完成写入字节,因为有时并非所有图像都正确传输。这是我正在使用的代码:

File photoFile = new File(getHeader); //getHeader is the file that i have to transfer
int size2 = (int) photoFile.length();
byte[] bytes2 = new byte[size2];
try {
    BufferedInputStream buf = new BufferedInputStream(new FileInputStream(photoFile)); 
    buf.read(bytes2, 0, bytes2.length);
    buf.close();
    } catch (FileNotFoundException e) {
         e.printStackTrace();
    } catch (IOException e) {
         e.printStackTrace();
    }
    client.getOutputStream().write(bytes2, 0, size2); //client is the server socket

谢谢

4

2 回答 2

6

我的问题是如何在关闭套接字连接之前检查 OutputStream 是否已完成写入字节,因为有时并非所有图像都正确传输

不,您的问题是您假设read()填充缓冲区。OutputStream写入返回时已完成写入。记住这一点:

while ((count = in.read(buffer)) > 0)
{
    out.write(buffer, 0, count);
}

这是在 Java 中复制流的正确方法。你的不是。

您还假设文件大小适合int,并且整个文件适合内存,并且在写入任何内容之前您正在浪费时间和空间将整个文件(可能)读入内存。上面的代码适用于 1 字节以上的任何大小的缓冲区。我通常使用 8192 字节。

于 2013-07-11T08:02:57.950 回答
4

一个常见的解决方案是在数据前面加上一些字节(比如四个)来描述正在发送的数据的长度。

接收服务器读取前四个字节,计算长度并知道何时完成读取文件。

于 2013-07-11T08:01:04.393 回答