0

Ich habe einen grundlegenden Client Server erstellt, der Bilddateien in einem bestimmten Verzeichnis über ein Netzwerk sendet. Der Code funktionierte letzte Woche, aber ich kam heute darauf zurück und es scheint, dass ich nur eine Datei auf der Serverseite bekomme, obwohl der Client ausgibt, dass er alle Bilddateien in dem Verzeichnis gesendet hat. Es kann etwas im Client-Code sein, aber ich denke, es ist etwas auf der Serverseite. Jede Hilfe wird sehr geschätzt und wenn Sie eine effizientere Lösung haben, bin ich glücklich, meinen Code wie nötig zu ändern. Mein Code ist unten:Object Input Stream erhält nur eine Datei über das Netzwerk?

Image

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

    } 


} 

Ich bin mir bewusst, dass es eine Menge Code zu lesen ist durch, aber ich schätze jede Hilfe, die ich auf diese bekommen!

Ich könnte falsch liegen, aber aus Gründen der Effizienz und Netzwerkverkehr, wäre es vorteilhaft, die Bilder als zip vom Client an den Server zu senden?

Antwort

3

Warum verwenden Sie überhaupt ObjectInputStream? Sie lesen oder schreiben keine serialisierten Objekte - nur rohe Binärdaten. Verwenden Sie, was auch immer InputStream bereitgestellt wird, und lesen Sie daraus.

Wie auch immer, das ist nicht das große Problem. Das große Problem besteht darin, dass Sie nur mehrere Dateien in einen Stream schreiben, ohne zu wissen, wo eine Datei enden soll und die nächste beginnen soll. Wie haben Sie erwartet, dass Sie die verschiedenen Dateien aufteilen? Optionen:

  • Verwenden Sie ein Trennzeichen zwischen Dateien (sehr hässlich - Sie haben würden, um möglicherweise alle Daten zu entkommen, die wie das Trennzeichen sahen, wie Sie entlang gingen)
  • Präfix jede Datei mit seiner Länge
  • jeden senden Datei auf eine andere Verbindung

(Sie sind auch ein einziges Byte zu einem Zeitpunkt, zu lesen und zu schreiben. Verwenden Sie die Überlastung von Lese-/Schreib dem Byte-Arrays akzeptieren.)

+1

So würden Sie empfehlen die Verwendung von so etwas wie ein BufferedOutputStream stattdessen? –

+0

In Bezug auf das Senden der Dateien auf verschiedenen Verbindungen, könnte dies nur durch Erstellen eines neuen Ausgabe (und Eingabe) Stream für jede Datei oder ist es etwas komplexer? –

+0

@Christopher: Sie müssen jedes Mal einen anderen Socket verwenden. Für, ob Sie 'BufferedOutputStream' brauchen ... persönlich würde ich keine explizite Pufferung hinzufügen, bis Sie gefunden haben, dass Sie es benötigt haben. Mein Hauptpunkt war, "Objekt * Stream" loszuwerden, was dir nicht gut tut (und die Lesbarkeit schädigt, indem es vorschlägt, dass du tatsächlich Objekte schreibst). –

Verwandte Themen