0

私は、ネットワークを介して指定されたディレクトリに画像ファイルを送る基本的なクライアントサーバを作成しました。コードは先週働いていましたが、私は今日それに戻ってきました。クライアントがディレクトリ内のすべてのイメージファイルを送信したことを印刷しても、サーバー側で1つのファイルしか取得していないようです。 それはクライアントコードの中にあるかもしれませんが、私はそれがサーバー側の何かだと思います。 ご協力いただきまして誠にありがとうございます。より効率的なソリューションをお持ちの場合は、必要に応じてコードを変更させていただきます。私のコードは以下の通りです:オブジェクト入力ストリームはネットワーク経由で1つのファイルしか取得できませんか?

ImageServerの

 package com.encima.network.server; 

     import java.io.*; 
     import java.net.*; 

     public class ImageServer{ 

    ServerSocket ss; 
    Socket s; 
    ObjectOutputStream oos; 
    int port = 4440; 

    public ImageServer() throws IOException { 
     try { 
     ss = new ServerSocket(port); 
     System.out.println("Server started on Port: " + port); 
     } catch(IOException e) { 
     System.out.println("Serevr: Port-" + port + " not available, exiting."); 
     System.exit(0); 
     } 

     System.out.println("Server: Waiting for Client Connection..."); 

     while(true) { 
     try { 
     s = ss.accept(); 
     new ImageHandler(s); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     } 
     } 
    } 

    public static void main(String[] args) throws IOException { 
     ImageServer is = new ImageServer(); 
    } 

     } 

ImageHandler 

    package com.encima.network.server; 

    import java.awt.image.BufferedImage; 
    import java.io.FileOutputStream; 
    import java.io.ObjectInputStream; 
    import java.net.Socket; 

    import javax.imageio.ImageIO; 

    public class ImageHandler implements Runnable { 

    Socket s; 
    int count = 0; 

    public ImageHandler(Socket socket) { 
     s = socket; 
     Thread t = new Thread(this); 
     t.start(); 
    } 

    @Override 
    public void run() { 

     try { 
     ObjectInputStream ois = new ObjectInputStream(s.getInputStream()); 
     FileOutputStream fos = new FileOutputStream("image" + System.nanoTime() + ".jpg"); 
     count++; 
     //BufferedImage in = ImageIO.read(ois); 
     //ImageIO.write(in, "jpg", fos); 

     int ch = 0; 
     while(true) { 
     ch = ois.read(); 
      if(ch == -1) { 
      break; 
      } 
     fos.write(ch); 
     } 
     fos.flush(); 
     } catch (Exception e) { 
     e.printStackTrace(); 
     } 
    } 
    } 



Finally, the ImageClient 

    package com.encima.network.client; 

    import java.awt.image.BufferedImage; 
    import java.io.File; 
    import java.io.FileInputStream; 
    import java.io.IOException; 
    import java.io.ObjectOutputStream; 
    import java.net.Socket; 

    import javax.imageio.ImageIO; 

    import com.encima.network.ImageFilter; 


    public class ImageClient { 

    Socket s; 
    String ip = "localhost"; 
    int port = 4440; 
    ObjectOutputStream oos; 

    public ImageClient(File[] files) throws IOException, ClassNotFoundException, InterruptedException { 

     try { 
     s = new Socket(ip, port); 
     System.out.println("Client connected to Server via " + ip + " on port 80"); 
     } catch (Exception e) { 
     System.out.println("Client: Cannot find Host: " + ip + ". Exiting."); 
     System.exit(0); 
     } 

     oos = new ObjectOutputStream(s.getOutputStream()); 

     for(File f: files) { 
     sendFile(f); 
     } 
     oos.close(); 
     //System.out.println("Written Image " + i + " of " + files.length); 
    } 

    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException { 
     File dir = new File("/Users/christophergwilliams/Dropbox/PhD/Projects/PhD/Year 1/GSN/images"); 
     File[] files = dir.listFiles(new ImageFilter()); 
     ImageClient ic = new ImageClient(files); 
    } 

    public void sendFile(File file) throws IOException { 
     FileInputStream fis = new FileInputStream(file); 
     //BufferedImage b = ImageIO.read(file); 
     //ImageIO.write(b, "jpg", oos); 
     int ch = 0; 
     while(true) { 
     ch = fis.read(); 
     if(ch == -1) { 
     break; 
     } 
     oos.write(ch); 
     } 
     oos.flush(); 
     System.out.println("Image Sent"); 

    } 


} 

は、私は通じ読むために多くのコードであることを承知していますが、私はこの上で取得することができます任意の助けに感謝ください!

私は間違っているかもしれませんが、効率とネットワークトラフィックのために、イメージをクライアントからサーバーに送信すると有益でしょうか?

答えて

3

なぜObjectInputStreamを使用していますか?シリアライズされたオブジェクトを読み書きすることはありません。生のバイナリデータだけです。どのようなInputStreamが提供されているものを使用し、それから読む。

とにかく、それは大きな問題ではありません。大きな問題は、1つのストリームに複数のファイルを書き込んでいるだけで、1つのファイルが終了する場所と次のファイルが開始される場所が示されていないことです。どのように複数のファイルを分割する予定ですか?オプション:

  • は、ファイル間の区切り文字(非常に醜い - あなたは潜在的にあなたが一緒に行ったとして、区切り文字のように見えた任意のデータエスケープする必要があると思います)を使用し
  • プレフィックスをその長さ
  • を持つ各ファイルは、それぞれの送信を異なる接続

上のファイル(あなたはまた、一度に1バイトを読んで、書いている。バイト配列を受け入れ、読み取り/書き込みのオーバーロードを使用してください。)

+1

だから、あなたは次のようなものを使用することをお勧めします代わりにBufferedOutputStream? –

+0

異なる接続でファイルを送信することに関しては、それは各ファイルに対して新しい出力(および入力)ストリームを作成するだけで済むのでしょうか、それとももっと複雑なものでしょうか? –

+0

@Christopher:毎回別のソケットを使って接続する必要があります。あなたが 'BufferedOutputStream'を必要としているかどうかについては、個人的には、あなたがそれを必要とするまで明示的なバッファリングを追加することはありません。私の主なポイントは、あなたに何もしていない 'Object * Stream'を取り除くことでした(オブジェクトを実際に書き出していることを示唆して読みやすさに害を与えています)。 –

関連する問題