- - PR -
画像ファイルのソケット通信
1|2|3
次のページへ»
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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); } |
|
投稿日時: 2005-02-08 14:34
どのようにうまくいかないでしょうか?
|
|
投稿日時: 2005-02-08 16:03
パテ太と申します。
ぜんぜん的外れだったら申し訳ありませんが 少し気になったことを書きます。 bufは画像ファイルを受け取るための領域なので byte[] でしょうか? System.out はPrintStreamですが PrintStreamにはbyte[]を引数にする printメソッドはありません。 Objectを引数にした時のメソッドが呼び出されるため buf.toString()を実行した時の変な文字列 (オブジェクトのハンドル)が表示されます。 たぶんSystem.out.print()をデバッグ用途に 使用しようとしていらっしゃると思われるのですが 上記のようにbufの中身は表示されないので デバッグはできません。 |
|
投稿日時: 2005-02-08 16:44
すいません。
System.out.printはとおってるかどうかという確認だけにしようしています。 クライアントにて受信するのですが、 同じようにloopにて受信しているのですが、保存をして画像ファイルを見ても からのファイルができているだけです。 最終的にはImageに入れ、アプレット上にて表示しようと考えているのですが・・・ |
|
投稿日時: 2005-02-08 16:44
すいません。
System.out.printはとおってるかどうかという確認だけにしようしています。 クライアントにて受信するのですが、 同じようにloopにて受信しているのですが、保存をして画像ファイルを見ても からのファイルができているだけです。 最終的にはImageに入れ、アプレット上にて表示しようと考えているのですが・・・ |
|
投稿日時: 2005-02-08 16:47
憶測ですが、
dos.write(buf,0,len); のあとにdos.flush()をしないといけないんじゃなかったかなぁ もしくは最後にdos.close()。 |
|
投稿日時: 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(); ----------------- |
|
投稿日時: 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); } |
1|2|3
次のページへ»