对象输入流只通过网络获取一个文件?

时间:2010-12-02 16:22:17

标签: java networking client-server objectoutputstream objectinputstream

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

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

     }


}

我知道要阅读的代码很多,但我很感激我能得到的任何帮助!

我可能错了,但为了提高效率和网络流量,将图像作为zip从客户端发送到服务器是否有益?

1 个答案:

答案 0 :(得分:3)

你为什么要使用ObjectInputStream?您不是在读或写任何序列化对象 - 只是原始二进制数据。使用提供的InputStream,并从中读取。

无论如何,这不是大问题。最大的问题是你只是将几个文件写入一个流,没有任何迹象表明一个文件要完成的位置,而下一个文件是要启动的。您是如何期望拆分多个文件的?选项:

  • 在文件之间使用分隔符(非常难看 - 你必须潜逃任何看起来像分隔符的数据)
  • 以长度
  • 为每个文件添加前缀
  • 在不同的连接上发送每个文件

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