0

我创建了一个基本的客户端服务器,它将通过网络发送指定目录中的图像文件。该代码上周工作,但我今天又回来了,似乎我只在服务器端获得一个文件,即使客户端打印出它已经发送了目录中的所有图像文件。它可能在客户端代码中,但我认为它在服务器端。非常感谢任何帮助,如果您有更有效的解决方案,我很乐意根据需要更改我的代码。我的代码如下:

图像服务器

        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提供的任何内容,并从中阅读。

无论如何,这不是什么大问题。最大的问题是您只是将多个文件写入一个流,而没有指示一个文件应该在哪里完成而下一个文件应该从哪里开始。您希望如何拆分多个文件?选项:

  • 在文件之间使用分隔符(非常难看 - 您可能必须转义任何看起来像分隔符的数据)
  • 在每个文件前面加上它的长度
  • 在不同的连接上发送每个文件

(您还一次读取和写入一个字节。使用接受字节数组的读/写重载。)

于 2010-12-02T16:28:28.337 回答