Hallo Leute,
ich mache schon einige Tage an einem kleinen Problem mit Java Sockets rum.
Ich habe ein kleines Spiel geschrieben und möchte um Erfahrung zu sammeln mal ein bisschen mit Netzwerkprogrammierung arbeiten.
Ich habe mir ein kleines Protokollausgedacht, das mit Bytefolgen arbeitet.
Sprich mein Client bekommt ein bestimmtes byte was zum Beispiel für ein Bewegungsbefehl steht. Mein Client weis nun ok jetzt kommen X Bytes die den Bewegungsbefehl repräsentieren und liest die nächste X Bytes ein. Dann kommt das nächste Byte was das nächsten Befehl angibt usw.
Mein Problem ist, dass bei mir alles einwandfrei lokal funktioniert. Sprich wenn ich auf meinem Computer ein Spiel hoste und mit einer zweiten Instanz joine läuft alles perfekt und wunderbar, also über den lokalen TCP Stack.
Jetzt wollte ich die Sache einem Freund zeigen und schicke Ihm einen Client. Portforwardings etc sind gemacht. Ich starte meinen Server und mein Freund kann darauf Joinen und es läuft auch erstmal gut.
Wenn ich in meinem Beispiel z.b. 10 Einheiten erstelle und nur wenig Befehle übertragen werden, dann läuft alles gut und auch über längere zeit stabil. Wenn ich jetzt allerdings 1000 Einheiten habe, dann fängt es an zu laggen. Womit ich auch kein Problem habe ( Dient nur als Stresstest). Allerdings wenn ich jetzt z.b. 2000 Einheiten erstelle dann lagt es stark und der Client Crashed, Weil er eine Falsche Bytefolge einliest, bzw eine ungültige. Also es kommen einfach falsche Bits an, bzw es Fehlen welche. Da der Client z.b. einen Befehl Bewegung bekommt und dann soll er 12 Byte lesen und dann kommt das nächste Kontrollbit. Jetzt kommen allerdings nur z.b. 10 und dann das nächste Kontrollbit, womit mein Client natürlich das falsche Byte als Befehlsbyte liest und crashed.
Mir ist nicht ganz klar warum das passiert und was ich dagegen tun kann.
Das sind gerade meine Funktionen die zum Senden und Empfangen benutze:
Server:
Client:
Über jede Idee oder Hilfe wäre ich sehr dankbar.
Bisher bin ich davon ausgegangen, dass die Java-Sockets TCP Benutzen und hier dann die Sichere Übertragung gewährleistet werden sein sollte.
Danke euch, xasz
ich mache schon einige Tage an einem kleinen Problem mit Java Sockets rum.
Ich habe ein kleines Spiel geschrieben und möchte um Erfahrung zu sammeln mal ein bisschen mit Netzwerkprogrammierung arbeiten.
Ich habe mir ein kleines Protokollausgedacht, das mit Bytefolgen arbeitet.
Sprich mein Client bekommt ein bestimmtes byte was zum Beispiel für ein Bewegungsbefehl steht. Mein Client weis nun ok jetzt kommen X Bytes die den Bewegungsbefehl repräsentieren und liest die nächste X Bytes ein. Dann kommt das nächste Byte was das nächsten Befehl angibt usw.
Mein Problem ist, dass bei mir alles einwandfrei lokal funktioniert. Sprich wenn ich auf meinem Computer ein Spiel hoste und mit einer zweiten Instanz joine läuft alles perfekt und wunderbar, also über den lokalen TCP Stack.
Jetzt wollte ich die Sache einem Freund zeigen und schicke Ihm einen Client. Portforwardings etc sind gemacht. Ich starte meinen Server und mein Freund kann darauf Joinen und es läuft auch erstmal gut.
Wenn ich in meinem Beispiel z.b. 10 Einheiten erstelle und nur wenig Befehle übertragen werden, dann läuft alles gut und auch über längere zeit stabil. Wenn ich jetzt allerdings 1000 Einheiten habe, dann fängt es an zu laggen. Womit ich auch kein Problem habe ( Dient nur als Stresstest). Allerdings wenn ich jetzt z.b. 2000 Einheiten erstelle dann lagt es stark und der Client Crashed, Weil er eine Falsche Bytefolge einliest, bzw eine ungültige. Also es kommen einfach falsche Bits an, bzw es Fehlen welche. Da der Client z.b. einen Befehl Bewegung bekommt und dann soll er 12 Byte lesen und dann kommt das nächste Kontrollbit. Jetzt kommen allerdings nur z.b. 10 und dann das nächste Kontrollbit, womit mein Client natürlich das falsche Byte als Befehlsbyte liest und crashed.
Mir ist nicht ganz klar warum das passiert und was ich dagegen tun kann.
Das sind gerade meine Funktionen die zum Senden und Empfangen benutze:
Server:
Java:
public void send(byte[] bytes) throws IOException {
if(this.socket.isClosed()){
this.stopListen();
this.gameServer.removeClientHandler(this);
return;
}
this.outputStream.write(bytes);
this.outputStream.flush();
}
public void read(byte[] bytes){
try {
this.inputStream.read(bytes);
} catch (IOException e) {
this.gameServer.removeClientHandler(this);
this.stopListen();
e.printStackTrace();
}
}
Client:
Java:
public void send(byte[] bytes) throws IOException {
this.outputStream.write(bytes);
this.outputStream.flush();
}
public void read(byte[] bytes){
try {
this.inputStream.read(bytes);
System.out.println("Recieve:"+NetworkConnector.bytesToString(bytes));
} catch (IOException e) {
e.printStackTrace();
}
}
Über jede Idee oder Hilfe wäre ich sehr dankbar.
Bisher bin ich davon ausgegangen, dass die Java-Sockets TCP Benutzen und hier dann die Sichere Übertragung gewährleistet werden sein sollte.
Danke euch, xasz
Zuletzt bearbeitet: