画像を送信することを目的とした「サーバー」から、Android デバイスである「クライアント」に画像を送信しようとしています。その間のソケットは開いたままになり、画像が来続けます。問題は:
- 画像のサイズがわかりません (変更される可能性があります)。
- 画像は BMP 形式ではありません。
以下の私のコードでは:
- 画像が転送された後、クライアントは読み取りを停止しません (
-1
読み取られたときに取得できません)。ソケットが閉じられたときに停止します。 - 読み取りが終了した後、入力ストリームはクリアされず、同じイメージが何度も読み取られます。
最初に、サイズがわかっている 2 つの BMP 画像 (両方とも同じサイズ) を送信しようとしました。サーバーコードは次のとおりです。
public static void main(String[] args) {
try {
ServerSocket s = new ServerSocket(4488);
System.out.println("Waiting for a connection . . . . ");
Socket socket = s.accept();
System.out.println("Connected!");
DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
Thread.sleep(2000);
File myImageFile = new File("c:\\1\\a.bmp");
FileInputStream fis = new FileInputStream(myImageFile);
byte[] data = new byte[(int) myImageFile.length()];
byte[] tmp = new byte[0];
byte[] myArrayImage = new byte[0];
int len = 0 ;
int total = 0;
while( (len = fis.read(data)) != -1 ) {
total += len;
tmp = myArrayImage;
myArrayImage = new byte[total];
System.arraycopy(tmp,0,myArrayImage,0,tmp.length);
System.arraycopy(data,0,myArrayImage,tmp.length,len);
}
//
fis.close();
dataOutputStream.write(myArrayImage);
dataOutputStream.flush();
Thread.sleep(2000);
myImageFile = new File("c:\\1\\b.bmp");
fis = new FileInputStream(myImageFile);
data = new byte[(int) myImageFile.length()];
tmp = new byte[0];
myArrayImage = new byte[0];
len = 0 ;
total = 0;
while( (len = fis.read(data)) != -1 ) {
total += len;
tmp = myArrayImage;
myArrayImage = new byte[total];
System.arraycopy(tmp,0,myArrayImage,0,tmp.length);
System.arraycopy(data,0,myArrayImage,tmp.length,len);
}
fis.close();
dataOutputStream.write(myArrayImage);
dataOutputStream.flush();
Thread.sleep(2000);
socket.close();
s.close();
クライアントコードは次のとおりです。
@Override
public void run() {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
byte[] byteChunk = null;
int c;
if (_dataInputStream != null) {
while (true) {
try {
Thread.sleep(200);
} catch (Exception e) {
}
try {
byteChunk = new byte[1024];
while ((c = _dataInputStream.read(byteChunk)) != -1){
buffer.write(byteChunk, 0, byteChunk.length);
}
} catch (IOException e) {
e.printStackTrace();
}
final Bitmap bitmap = BitmapFactory.decodeByteArray(buffer.toByteArray(), 0, buffer.size());
if (bitmap != null) {
_handler.post(new Runnable() {
public void run() {
_iv.setImageBitmap(bitmap);
_iv.invalidate();
}
});
}
buffer.reset();
}
}
}
さて、私が言ったように、ソケットが閉じられるまでクライアントはwhileループにとどまり、その後(クライアント側で1つの画像にのみ適合するバイト配列を作成したため、送信する画像の数に関係なく)これを読み続けますいつも最初の画像。
私が間違っていることはありますか?
Ps 画像が BMP でない場合、クライアント側のコードで記述したデコードは機能しますか? 送りたい実画像はPNGです。