- PR -

画像ファイルのソケット通信

投稿者投稿内容
未記入じゃけんど
ベテラン
会議室デビュー日: 2004/11/09
投稿数: 65
お住まい・勤務地: Osaka City
投稿日時: 2005-02-08 14:22
こんにちは、いつも参考にさせていただいております。

今、ソケット通信を使用して、画像ファイルの送信処理を実行しようとおもいます。
画像ファイルを、バイナリ-形式で送受信しようと思います。
がどうしてもうまくいきません。バイナリファイルの読み込み方法を教えてください。

現在はサーバー側は下のようなコードにて送信しております。

  sock = serversock.accept();
  FileInputStream input=new FileInputStream("image3.jpg");
  out = sock.getOutputStream();
  dos = new DataOutputStream(out);

  int len;

  // 最後まで読み込み
  while((len=input.read(buf))!=-1){
  dos.write(buf,0,len);
  System.out.print(buf);
  }
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-02-08 14:34
どのようにうまくいかないでしょうか?
パテ太
ベテラン
会議室デビュー日: 2004/08/16
投稿数: 64
お住まい・勤務地: 千葉・東京
投稿日時: 2005-02-08 16:03
パテ太と申します。
ぜんぜん的外れだったら申し訳ありませんが
少し気になったことを書きます。
bufは画像ファイルを受け取るための領域なので
byte[] でしょうか?
System.out はPrintStreamですが
PrintStreamにはbyte[]を引数にする
printメソッドはありません。
Objectを引数にした時のメソッドが呼び出されるため
buf.toString()を実行した時の変な文字列
(オブジェクトのハンドル)が表示されます。

たぶんSystem.out.print()をデバッグ用途に
使用しようとしていらっしゃると思われるのですが
上記のようにbufの中身は表示されないので
デバッグはできません。
未記入じゃけんど
ベテラン
会議室デビュー日: 2004/11/09
投稿数: 65
お住まい・勤務地: Osaka City
投稿日時: 2005-02-08 16:44
すいません。
System.out.printはとおってるかどうかという確認だけにしようしています。
クライアントにて受信するのですが、
同じようにloopにて受信しているのですが、保存をして画像ファイルを見ても
からのファイルができているだけです。
最終的にはImageに入れ、アプレット上にて表示しようと考えているのですが・・・
未記入じゃけんど
ベテラン
会議室デビュー日: 2004/11/09
投稿数: 65
お住まい・勤務地: Osaka City
投稿日時: 2005-02-08 16:44
すいません。
System.out.printはとおってるかどうかという確認だけにしようしています。
クライアントにて受信するのですが、
同じようにloopにて受信しているのですが、保存をして画像ファイルを見ても
からのファイルができているだけです。
最終的にはImageに入れ、アプレット上にて表示しようと考えているのですが・・・
H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2005-02-08 16:47
憶測ですが、

dos.write(buf,0,len);
のあとにdos.flush()をしないといけないんじゃなかったかなぁ
もしくは最後にdos.close()。
さたろう
会議室デビュー日: 2005/02/07
投稿数: 11
投稿日時: 2005-02-08 17:06
参考になるかどうかはわかりませんが,昔,似たようなことをしたことがあるので,そのソースの一部を載せておきます.
H2さんのおっしゃるとおり,バッファリングしているため,データがある一定の情報量に達していない場合は,“flush()”や“close()”メソッドを呼び出さなければ,書き出されません.
あと,私の昔のソースでは,“ByteArrayOutputStream”で一度全部のデータを読み込んで,そのデータをbyte[]にして,それを一度に送るようにしているようです.

--------
// ソケットの作成
Socket sock = new Socket(host, port);
BufferedReader sockin = new BufferedReader(new InputStreamReader(sock.getInputStream()));
OutputStream sockout = sock.getOutputStream();

FileInputStream tmpFI= new FileInputStream(file);
ByteArrayOutputStream receivedBuffer = new ByteArrayOutputStream();
byte b[] = new byte[256];
int len =-1;
while((len=tmpFI.read(b,0,b.length))!=-1){
 receivedBuffer.write(b,0,len);
}
receivedBuffer.flush();
byte buf2[] = receivedBuffer.toByteArray();
sockout.write(buf2, 0, buf2.length);
sockout.flush();
receivedBuffer.close();
// ソケットのクローズ
sockout.close();
sockin.close();
sock.close();
-----------------
未記入じゃけんど
ベテラン
会議室デビュー日: 2004/11/09
投稿数: 65
お住まい・勤務地: Osaka City
投稿日時: 2005-02-09 11:26
皆様ありがとうございます。
サーバー側と、クライアント側のソースを変更しました。
しかしどうもソケットのWriteエラーが発生してしまいます。
クライアント側で指定するファイル名等がおかしいのでしょうか?

*****サーバ側ソース******

public static void main(String[] args){
// サーバーのソケット
ServerSocket serversock = null;
// ソケット
Socket sock = null;
OutputStream out = null;
DataOutputStream dos = null;
byte buf[] = new byte[256];

String debugPoint = "";
try {
serversock = new ServerSocket(5555);
// 無限ループ
while (true) {

sock = serversock.accept();
FileInputStream input=new FileInputStream("image3.jpg");

out = sock.getOutputStream();
dos = new DataOutputStream(out);

int len;

// 最後まで読み込み
while((len=input.read(buf))!=-1){
dos.write(buf,0,len);
}
// バッファを使用
//BufferedOutputStream wwwBuf = new BufferedOutputStream();
dos.close();
out.close();
sock.close();
input.close();
System.out.println("画像送信完了いたしました。");
}
} catch ( Exception e ){
System.out.println("エラーが発生" + e.toString());
System.out.println(debugPoint);
}


*****クライアント側******

// ソケット通信で文字列を受信
try {
// サーバーのポート番号
name = "1";
sock = new Socket(IPアドレス,5555);
BufferedReader sockin = new BufferedReader(new InputStreamReader(sock.getInputStream()));
OutputStream sockout = sock.getOutputStream();

name = "2";
FileInputStream tmpFI= new FileInputStream("image3.jpg");
ByteArrayOutputStream receivedBuffer = new ByteArrayOutputStream();

name = "3";
byte b[] = new byte[256];
int len =-1;
while((len=tmpFI.read(b,0,b.length))!=-1){
receivedBuffer.write(b,0,len);
}
receivedBuffer.flush();
byte buf2[] = receivedBuffer.toByteArray();
name = "4";

sockout.write(buf2, 0, buf2.length);

sockout.flush();
receivedBuffer.close();
name = "5";
// ソケットのクローズ
sockout.close();
sockin.close();
sock.close();

} catch (IOException ex) {
System.err.println("エラー発生 - " +ex.toString());
System.err.println(name);
}

スキルアップ/キャリアアップ(JOB@IT)