ServerSocketとSocketを設定しているので、ServerSocketはImageIO.write(....)を使用して画像のストリームを送信し、Socketはそれらを読み取ってJFrameを更新しようとします。そこで、ImageIOが画像の終わりを検出できるかどうか疑問に思いました。(私はJPEG形式の知識がまったくないので、代わりにテストしました)
どうやら、そうではありません。
サーバー側では、ImageIO.write(...)をループで使用し、その間にいくつかのスリープを設定して、画像を継続的に送信しました。クライアント側では、ImageIOは最初の画像を問題なく読み取りましたが、次の画像ではnullを返しました。これは紛らわしいです。最初の画像の読み取りをブロックするか(次の画像がまだ同じ画像の一部であると見なすため)、またはすべての画像の読み取りに成功する(機能するため)ことを期待していました。何が起こっている?ImageIOは最初の画像の終わりを検出しているように見えますが、2番目の画像は検出していません。(ちなみに、画像は大まかに似ています)このような画像をストリーミングする簡単な方法はありますか、それとも指定されたバイトまたはシーケンスに達するまでバイトをバッファに読み込む独自のメカニズムを作成する必要がありますか?バイト、どの時点でバッファから画像を読み取りますか?
これは私のサーバーコードの便利な部分です:
while(true){
Socket sock=s.accept();
System.out.println("Connection");
OutputStream out=sock.getOutputStream();
while(!socket.isClosed()){
BufferedImage img=//get image
ImageIO.write(img, "jpg", out);
Thread.sleep(100);
}
System.out.println("Closed");
}
そして私のクライアントコード:
Socket s=new Socket(InetAddress.getByName("localhost"), 1998);
InputStream in=s.getInputStream();
while(!s.isClosed()){
BufferedImage img=ImageIO.read(in);
if(img==null)//this is what happens on the SECOND image
else // do something useful with the image
}