-1

Androidフォン(クライアント)からPC(サーバー)に5秒の差がある2つの画像を送信しようとしています。私はこれを行うために 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)、最初の画像のコードのみをブロックし、その後プログラムを終了して、2 番目の画像をブロックしないことです。

-1最初の画像が完全に受信されると返されることはわかっていますが、2回目に機能させるにはどうすればよいですか?

4

1 に答える 1

1

-1 が返された場合readは、相手側が接続を閉じたことを意味します。しかし、あなたの基本的な問題は、接続をストリームとして処理していないようです。データ ストリームには固有の「パッケージ」はありません。この場合、ある画像を次の画像と区別する組み込みの方法はありません。

少なくとも 3 つの異なる方法で続行できます。

  • 独自の単純なプロトコルを追加します。たとえば、送信側で、画像にバイト数を書き込み、次に画像バイトを書き込み、次の画像にバイト数を書き込み、次の画像を書き込むなど、接続を閉じずに。受信側では、最初にバイト数を読み取り、次にそのバイト数の画像データを読み取るループを作成します。
  • 接続ごとに 1 つのイメージを書き込み、接続を閉じて、次のイメージ用に新しい接続を作成します。
  • この場合、データは JPEG 画像なので、すべての JPEG 画像を 1 つのデータ ストリームとして書き込み、受信側で JPEG 形式を解析して画像の境界がどこにあるかを確認します。

最初の選択肢は最も効率的で、画像ファイルの長さに加えて画像名やその他の追加データを提供するように簡単に拡張できます。2 番目は問題なく、最もシンプルで堅牢です (たとえば、バイト オーダーについて心配したり、送信者と受信者の間で同期がずれることを心配したりする必要はありません)。 、再接続すると少し遅くなります。3 番目の選択肢は、おそらく JPEG を使用する方法ではありません。可能性としてリストされているだけです。

于 2013-04-28T10:29:18.967 に答える