0

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

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从客户端发送到服务器会有好处吗?

回答

3

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

无论如何,这不是大问题。最大的问题是,你只是将几个文件写入一个流,而没有指出一个文件要完成的位置以及下一个文件要开始的位置。你如何期待分割多个文件?选项:

  • 使用的文件之间的分隔符(非常难看 - 你不得不逃离潜在看起来像分隔符,你跟着去了任何数据)
  • 前缀的每一个文件,它的长度
  • 发送各在不同的连接

文件(你也读,同时写一个字节。使用读取的过载/写一个接受字节数组。)

+1

所以,你会建议使用类似一个BufferedOutputStream呢? – 2010-12-02 16:38:05