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?
So würden Sie empfehlen die Verwendung von so etwas wie ein BufferedOutputStream stattdessen? –
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? –
@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). –