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