0

ネットワーク経由で指定されたディレクトリに画像ファイルを送信する基本的なクライアント サーバーを作成しました。コードは先週機能しましたが、今日戻ってきました。クライアントがディレクトリ内のすべての画像ファイルを送信したことを出力しても、サーバー側でファイルを 1 つしか取得していないようです。クライアントコードの何かかもしれませんが、サーバー側の何かだと思います。より効率的な解決策があれば、必要に応じてコードを変更させていただきます。私のコードは以下の通りです:

イメージサーバー

        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");

     }


}

たくさんのコードを読み通す必要があることは承知していますが、これについて何か助けていただければ幸いです。

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

4

1 に答える 1

3

そもそもなんで使っObjectInputStreamてんの?シリアル化されたオブジェクトを読み書きするのではなく、生のバイナリ データだけです。提供されているものは何でも使用InputStreamし、そこから読んでください。

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

  • ファイル間に区切り文字を使用します (非常に醜い - 途中で区切り文字のように見えるデータをエスケープする必要がある可能性があります)。
  • 各ファイルにその長さのプレフィックスを付ける
  • 各ファイルを異なる接続で送信する

(また、一度に 1 バイトの読み取りと書き込みを行っています。バイト配列を受け入れる読み取り/書き込みのオーバーロードを使用してください。)

于 2010-12-02T16:28:28.337 に答える