-1

我正在尝试将两张相差 5 秒的图像从 Android 手机(客户端)发送到 PC(服务器)。我正在使用 InputStream 为我做这件事。

        ServerSocket servsock = new ServerSocket(27508);
        Socket sock = servsock.accept();
        System.out.println("connection accepted ");
        int count;

        FileOutputStream fos = null;
        BufferedOutputStream bos = null;
        InputStream is = null;
        is = sock.getInputStream();

        int bufferSize = sock.getReceiveBufferSize();


        byte[] bytes = new byte[bufferSize];
        System.out.println("Here1");
        fos = new FileOutputStream("D:\\fypimages\\image" + imgNum + ".jpeg");
        bos = new BufferedOutputStream(fos);
        imgNum++;
        while ((count = is.read(bytes)) > 0)
        {
            bos.write(bytes, 0, count);
            System.out.println("count: " + count);
        }
        bos.flush();


        bytes = new byte[bufferSize];
        System.out.println("Here2");
        fos = new FileOutputStream("D:\\fypimages\\image" + imgNum + ".jpeg");
        bos = new BufferedOutputStream(fos);
        imgNum++;
        while ((count = is.read(bytes)) > 0)
        {
            bos.write(bytes, 0, count);
            System.out.println("count: " + count);
        }
        bos.flush();


        System.out.println("Here3");

问题是is.read(bytes)只为第一个图像阻塞代码,然后程序终止,它不会为第二个图像阻塞。

我知道-1当第一个图像完全收到时它会返回,但是我如何让它第二次工作呢?

4

1 回答 1

1

如果read返回-1,则表示对方关闭了连接。但是您的基本问题似乎是,您没有将连接作为流处理。在数据流中,没有固有的“包”,在这种情况下,没有内置的方法来区分一个图像和下一个图像。

您可以通过至少 3 种不同的方式进行操作:

  • 添加您自己的简单协议,例如:在发送端,在图像中写入字节数,然后写入图像字节,然后在下一个图像中写入字节数,然后写入下一个图像等,而不关闭连接。在接收端,循环首先读取字节数,然后读取那么多字节的图像数据。
  • 每个连接写入一个图像,然后关闭连接并为下一个图像创建新连接。
  • 在这种情况下,由于数据是JPEG图像,只需将所有JPEG图像写入一个数据流,然后在接收端解析JPEG格式以查看图像边界在哪里。

首选是最有效的,并且除了图像文件长度之外,还可以轻松扩展以提供图像名称或其他额外数据。第二个是可以的,并且最简单和健壮(例如,不需要担心字节顺序,或者担心发送者和接收者之间不同步),如果没有太多图像,但如果有数百张图像,然后重新连接会使事情变慢一点。第三种选择可能不是 JPEG 的方式,只是列出的可能性。

于 2013-04-28T10:29:18.967 回答