Hallo zusammen,
ich habe mich als Java-Neuling an Netzwerkprogrammierung gewagt. Ich hatte vor, ein Programm zum anzeigen von Verzeichnissen übers Netzwerk zu schreiben.
Dazu habe ich 2 Klassen (NetworkServer und NetworkClient). Alles funktioniert wie es soll, bis auf eine Sache: Wenn der Client die Verbindung abbricht, wird es vom Server nicht erkannt, und er durchläuft die Schleife zum Verarbeiten der Verbindung immer wieder.
Hoffentlich kann mir hier jemand helfen.
Grüße,
R2D2
Quelltexte:
NetworkServer.java
NetworkClient.java
Tester.java
Ordner.java
OrdnerinhaltComparator.java
ich habe mich als Java-Neuling an Netzwerkprogrammierung gewagt. Ich hatte vor, ein Programm zum anzeigen von Verzeichnissen übers Netzwerk zu schreiben.
Dazu habe ich 2 Klassen (NetworkServer und NetworkClient). Alles funktioniert wie es soll, bis auf eine Sache: Wenn der Client die Verbindung abbricht, wird es vom Server nicht erkannt, und er durchläuft die Schleife zum Verarbeiten der Verbindung immer wieder.
Hoffentlich kann mir hier jemand helfen.
Grüße,
R2D2
Quelltexte:
NetworkServer.java
Code:
import java.io.File;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.URL;
import java.util.Scanner;
public class NetworkServer extends Thread{
private ServerSocket server;
private Socket client;
private ObjectInputStream input;
private ObjectOutputStream output;
private String password;
private File folder;
public NetworkServer(int port, String password, File folder) {
this.password = password;
this.folder = folder;
try {
server = new ServerSocket(port);
} catch (IOException e) {
System.out.println("Fehler beim Starten des Servers: " + e.getMessage());
}
}
@Override
public void run() {
while (true) {
try {
client = server.accept();
try {
output = new ObjectOutputStream(client.getOutputStream());
} catch (IOException e) {
System.out.println("Fehler beim öffnen des OutputStreams: " + e.getMessage());
}
try {
input = new ObjectInputStream(client.getInputStream());
} catch (IOException e) {
System.out.println("Fehler beim öffnen des InputStreams: " + e.getMessage());
}
} catch (IOException e) {
System.out.println("Fehler beim Annehmen der Verbindung des Clients: " + e.getMessage());
}
while (!client.isClosed()) {
String command = (String) receive();
// Verbindungsherstellung
if (command != null && command.indexOf("hello") == 0 && command.indexOf(password) > 0) {
send("hello");
} // Dateiauflistung
else if (command != null && command.indexOf("list") == 0 && command.indexOf(password) > 0) {
String path = command.substring(12);
Ordner o = new Ordner(folder.getAbsolutePath() + path);
send(o.getFiles());
} // Datei senden
else if (command != null && command.indexOf("get") == 0 && command.indexOf(password) > 0) {
} else {
send("Error");
}
}
}
}
public void send(Object o) {
try {
output.writeObject(o);
} catch (IOException e) {
System.out.println("Fehler beim Senden an Client: " + e.getMessage());
}
}
public Object receive() {
Object o = null;
try {
o = input.readObject();
} catch (Exception e) {
System.out.println("Fehler beim Empfangen vom Client: " + e.getMessage());
}
return o;
}
}
NetworkClient.java
Code:
import java.io.File;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
public class NetworkClient {
private Socket client;
private ObjectOutputStream output;
private ObjectInputStream input;
private String password;
public NetworkClient() {
}
public int connect(String host, int port, String password) {
int ret = 0;
this.password = password;
try {
client = new Socket(host, port);
try {
output = new ObjectOutputStream(client.getOutputStream());
} catch (IOException e) {
System.out.print("Fehler beim öffnen des OutputStreams: " + e.getMessage());
}
try {
input = new ObjectInputStream(client.getInputStream());
} catch (IOException e) {
System.out.println("Fehler beim öffnen des InputStreams: " + e.getMessage());
}
send("hello " + password);
if (((String) receive()).equals("hello")) {
ret = 1;
} else {
ret = 0;
}
} catch (IOException e) {
System.out.println("Fehler beim Verbinden mit dem Server: " + e.getMessage());
ret = -1;
}
return ret;
}
public File[] receiveFileList() {
return receiveFileList("/");
}
public File[] receiveFileList(String path) {
send("list " + password + " " + path);
return (File[]) receive();
}
public void disconnect() {
if (client.isConnected()) {
try {
client.close();
} catch (IOException e) {
System.out.println("Fehler beim Schließen der Verbindung: " + e.getMessage());
}
}
}
public void send(Object o) {
try {
output.writeObject(o);
} catch (IOException e) {
System.out.println("Fehler beim Senden an Server: " + e.getMessage());
}
}
public Object receive() {
Object o = null;
try {
o = input.readObject();
} catch (Exception e) {
System.out.println("Fehler beim Empfangen vom Server: " + e.getMessage());
}
return o;
}
}
Tester.java
Code:
public class Tester {
public static void main(String[] args) {
NetworkServer server = new NetworkServer(1337, "123456", new java.io.File("E:/Spiele"));
server.start();
NetworkClient client = new NetworkClient();
int connect = client.connect("localhost", 1337, "123456");
if (connect == -1) {
System.out.println("Server anwortet nicht.");
} else if (connect == 0) {
System.out.println("Falsches Passwort.");
} else if (connect == 1) {
System.out.println("Verbindung hergestellt.");
}
java.io.File[] files = client.receiveFileList();
for (java.io.File f : files) {
System.out.println(f.getName());
}
client.disconnect();
}
}
Ordner.java
Code:
import java.io.File;
import java.util.Arrays;
import java.util.Comparator;
public class Ordner {
private File[] content;
private String[] filenames;
public Ordner(String path) {
content = new File(path).listFiles();
Comparator<File> vergleich = new OrdnerinhaltComparator();
Arrays.sort(content, vergleich);
}
public File[] getFiles() {
return content;
}
public String[] getFilenames() {
filenames = new String[content.length];
for (int i = 0; i < content.length; i++) {
filenames[i] = content[i].getName();
}
return filenames;
}
}
OrdnerinhaltComparator.java
Code:
import java.io.File;
import java.util.Comparator;
public class OrdnerinhaltComparator implements Comparator<File> {
public int compare(File o1, File o2) {
if (o1.isDirectory() && o2.isDirectory() || o1.isFile() && o2.isFile()) {
return o1.getName().compareTo(o2.getName());
}
return o1.isDirectory() ? -1 : 1;
}
}