Hallo,
ich bin gerade dabei ein Spiel netzwerkfähig zu machen. Im Spiel sind Server und Client implementiert. Ohne Netzwerk läuft es wunderbar.
Das Spiel lautet "Schiffe versenken" und ich versuche gerade ein Point-Objekt von einem Spiel zum anderen zu bekommen.
Das funktioniert auch meistens, doch hin und wieder schleicht sich eine EOFException ein.
Hier der Stacktrace:
Das Point-Objekt wird erzeugt, wenn innerhalb der GUI ein Button angeklickt wird, der wiederrum in einem 2D Button-Array abgelegt ist. Der Actionhandler leitet diese Eingabe (mit den x,y Koordinaten) an den Controller und der ruft dann die Client-Klasse auf, die das Point-Objekt erwartet und an den Server der Gegenstelle weiterschickt.
Hier der Client-Code:
Und hier der Servercode:
Hier die Ausgabe in netbeans:

In netbeans gehe ich so vor: Ich starte das Programm mit den Einstellungen oben (Client Port 3333, Server Port 4444)
Danach ändere ich die Ports so: (Client Port 4444, Server Port 3333) und starte das Programm zu zweiten Mal. Komischerweise wird nur in (run) Programm 1 die Ausgabe erzeugt, die im Server-Code steht (Schusskoordinaten). In (run) #2 Programm 2 steht nichts, auch wenn ich von (run) aus schieße.
Woran liegt das? Gehe ich hier richtig vor, um die Netzwerkfähigkeit des Spiels zu testen?
Warum erfolgt nur hin und wieder die EOFException? :bahnhof:
Ich hoffe, ihr könnt mir helfen...
ich bin gerade dabei ein Spiel netzwerkfähig zu machen. Im Spiel sind Server und Client implementiert. Ohne Netzwerk läuft es wunderbar.
Das Spiel lautet "Schiffe versenken" und ich versuche gerade ein Point-Objekt von einem Spiel zum anderen zu bekommen.
Das funktioniert auch meistens, doch hin und wieder schleicht sich eine EOFException ein.
Hier der Stacktrace:
Code:
java.io.EOFException
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2571)
at java.io.ObjectInputStream.skipCustomData(ObjectInputStream.java:1917)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1599)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1514)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1750)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
at de.oop.xxx.min.netzwerk.Server.<init>(Server.java:27)
at de.oop.xxx.min.SchiffeVersenkenController.<init>(SchiffeVersenkenController.java:26)
at de.oop.xxx.min.SchiffeVersenken.main(SchiffeVersenken.java:14)
Das Point-Objekt wird erzeugt, wenn innerhalb der GUI ein Button angeklickt wird, der wiederrum in einem 2D Button-Array abgelegt ist. Der Actionhandler leitet diese Eingabe (mit den x,y Koordinaten) an den Controller und der ruft dann die Client-Klasse auf, die das Point-Objekt erwartet und an den Server der Gegenstelle weiterschickt.
Hier der Client-Code:
Java:
public class Client {
public Client(Point aktuelleSchussKoordinate) {
try {
Socket socket = new Socket("127.0.0.1", 3333);
try (ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream())) {
oos.writeObject(aktuelleSchussKoordinate);
oos.flush();
}
} catch (UnknownHostException ex) {
System.out.println("Der Host ist unbekannt! " + ex);
} catch (IOException ex) {
System.out.println("Es gab folgenden Fehler: " + ex);
}
}
}
Und hier der Servercode:
Java:
public class Server {
@SuppressWarnings("CallToThreadDumpStack")
public Server() {
try {
ServerSocket serverSocket = new ServerSocket(4444);
while(true) {
Socket socket = serverSocket.accept();
try (ObjectInputStream ois = new ObjectInputStream(socket.getInputStream())) {
Point so = (Point) ois.readObject();
System.out.println("Schusskoordinaten X: " + so.x);
System.out.println("Schusskoordinaten Y: " + so.y);
} catch(EOFException ex) {
System.out.println("Mööpp!!! (EOFException)");
ex.printStackTrace();
}
}
} catch( IOException | ClassNotFoundException ex) {
System.out.println("Es gab folgenden Fehler: " + ex);
}
}
}
Hier die Ausgabe in netbeans:

In netbeans gehe ich so vor: Ich starte das Programm mit den Einstellungen oben (Client Port 3333, Server Port 4444)
Danach ändere ich die Ports so: (Client Port 4444, Server Port 3333) und starte das Programm zu zweiten Mal. Komischerweise wird nur in (run) Programm 1 die Ausgabe erzeugt, die im Server-Code steht (Schusskoordinaten). In (run) #2 Programm 2 steht nichts, auch wenn ich von (run) aus schieße.
Woran liegt das? Gehe ich hier richtig vor, um die Netzwerkfähigkeit des Spiels zu testen?
Warum erfolgt nur hin und wieder die EOFException? :bahnhof:
Ich hoffe, ihr könnt mir helfen...