Socket Problem mit ObjectInput/OutputSream

chaostheory

Bekanntes Mitglied
Hallo,
ich versuche gerade ein 2D-Spiel von mir netzwerkfähig zu machen. Ich versende verschiedene Klassen über einen ObjecOutputStream, für Sounds, Statusänderungen, Positionen usw.
Mit Abstand am öftesten versendet wird ein Array aus SpriteMessage, die lediglich drei Integer-Werte speichert.
Allerdings bekomme ich früher oder später jedes Mal eine ArrayStore- oder StreamCorruptedException. Mal läuft es nur einige Sekunden, mal eine Minute.
Code:
Exception in thread "Thread-8" java.lang.ArrayStoreException
Die StreamCorruptedExceptions haben verschiedene Fehlercodes, z.b. 00 oder 6C.
Alle Exceptions treten beim Lesen auf:
[JAVA=37]message = inputStream.readObject();[/code]

Sehr merkwürdig: Schreibe ich für jedes empfangene Objekt eine Nachricht in System.out (s. Senden Z. 37) funktioniert alles, läuft nur langsamer...

Verbindung herstellen:
[JAVA=83]//Stellt eine Verbindung zum angegebenen Socket her und gibt den Erfolg zurück
public boolean connect(Socket socket, boolean toHost) {
this.socket = socket;
try {
outputStream = new ObjectOutputStream(socket.getOutputStream());
inputStream = new ObjectInputStream(socket.getInputStream());
gameListener = new GameListener(main, inputStream);
gameListener.start();
if(toHost) main.setProgrammeStatus(ProgrammeStatus.NETWORK_CLIENT);
else {
main.setProgrammeStatus(ProgrammeStatus.NETWORK_HOST);
sendDisplayMode();
}
main.setStatus(GameStatus.MULTIPLAYER_GAME);
} catch (IOException e) {e.printStackTrace(); return false;}
return true;
}[/code]

Senden:
[JAVA=35]public void sendObject(Object object) {
//Löscht man die print-Befehle klappt gar nichts mehr. Warum weiß niemand.
//main.print("Sende " + object);
if(isConnected()) {
try {
outputStream.writeObject(object);
//main.print("Übertragung erfolgreich.");
} catch(SocketException e) {
if(e.getLocalizedMessage().equals("Connection reset")) {
main.getCommunicationManager().closeConnection();
main.getComponentHandler().showPopUp("Verbindung unterbrochen!");
}else e.printStackTrace();
}
catch (IOException e) {e.printStackTrace();}
}
}[/code]

Empfangene Nachrichten auswerten:
[JAVA=29]@Override
public void listen() {
Object message = null;
try {
message = inputStream.readObject();
} catch(SocketException e) {
if(e.getLocalizedMessage().equals("Connection reset") || e.getLocalizedMessage().equals("socket closed")) {
main.getCommunicationManager().closeConnection();
main.getComponentHandler().showPopUp("Verbindung unterbrochen!");
}else e.printStackTrace();
}
catch (IOException e) {e.printStackTrace();}
catch (ClassNotFoundException e) {e.printStackTrace();}

if(message != null) {
//main.print("Objekt erhalten: " + message);
if(message instanceof SpriteMessage[]) {
SpriteMessage[] sprites = (SpriteMessage[]) message;
for(SpriteMessage spriteMessage : sprites) {
if(displayFactorWidth != 1) spriteMessage.setX(Math.round(Math.round(spriteMessage.getX() * displayFactorWidth)));
if(displayFactorHeight != 1) spriteMessage.setY(Math.round(Math.round(spriteMessage.getY() * displayFactorHeight)));
}
main.getDrawManager().setSpriteMessages(sprites);
}else
if(message instanceof InputMessage) {
switch((InputMessage) message) {
case PLAYER_MOVE_CENTER: main.getGameManager().setPlayerDirection(1, Direction.CENTER); break;
case PLAYER_MOVE_RIGHT: main.getGameManager().setPlayerDirection(1, Direction.RIGHT); break;
case PLAYER_MOVE_LEFT: main.getGameManager().setPlayerDirection(1, Direction.LEFT); break;
case PLAYER_SHOOT: main.getGameManager().shootArrow(1); break;
}
}else
if(message instanceof StatusMessage) {
switch((StatusMessage) message) {
case LEVELCHANGE_START: main.setStatus(GameStatus.MULTIPLAYER_LEVELCHANGE);
main.getGameManager().setLevel(main.getGameManager().getLevel() + 1); break;
case LEVELCHANGE_END: main.setStatus(GameStatus.MULTIPLAYER_GAME); break;
case GAME_OVER: main.setStatus(GameStatus.SCORE); break;
case GAME_RESTART: main.setStatus(GameStatus.MULTIPLAYER_GAME); break;
case CONNECTION_END: main.getCommunicationManager().closeConnection();
main.print("Partner hat Spiel verlassen, schließe Verbindung.");
main.getComponentHandler().showPopUp("Der Partner hat das Spiel verlassen."); break;
}
}else
if(message instanceof SoundNumber) {
main.getSoundHandler().playSound((SoundNumber) message);
}else
if(message instanceof PlayerScoreMessage) {
main.getGameManager().setPlayerPoints(0, ((PlayerScoreMessage) message).getFirstScore());
main.getGameManager().setPlayerPoints(1, ((PlayerScoreMessage) message).getSecondScore());
}else
if(message instanceof DisplayModeMessage) {
main.print("DisplayMode erhalten");
DisplayMode ownDisplayMode = main.getScreenHandler().getCurrentDisplayMode();
DisplayMode oppositeDisplayMode = ((DisplayModeMessage) message).getDisplayMode();
main.print(ownDisplayMode.getWidth() + " " + ownDisplayMode.getHeight());
main.print(oppositeDisplayMode.getWidth() + " " + oppositeDisplayMode.getHeight());
displayFactorWidth = (double) 1 / oppositeDisplayMode.getWidth() * ownDisplayMode.getWidth();
displayFactorHeight = (double) 1 / oppositeDisplayMode.getHeight() * ownDisplayMode.getHeight();
main.print("DisplayFactorWidth: " + displayFactorWidth);
main.print("DisplayFactorHeight: " + displayFactorHeight);
}
}
}[/code]

SpriteMessage:
[JAVA=5]public class SpriteMessage implements Serializable {

private static final long serialVersionUID = -7914187131101524916L;

private final int imageNumber;
private int x;
private int y;

public SpriteMessage(int imageNumber, double x, double y) {
this.imageNumber = imageNumber;
this.x = Math.round(Math.round(x));
this.y = Math.round(Math.round(y));
}

public int getImageNumber() {
return imageNumber;
}

public int getX() {
return x;
}

public int getY() {
return y;
}

public void setX(int x) {
this.x = x;
}

public void setY(int y) {
this.y = y;
}
}[/code]
 

irgendjemand

Top Contributor
warum schreibst du dir eine "daten-klasse" und haust davon noch ein paar in ein array / ne list ... wenn es eh nur "raw-daten" sind die du auch in string-form über die streams des sockets schicken kannst ...

ich denke das "serialisierung" hier ein wenig overkill ist
 

andre111

Bekanntes Mitglied
Naja, ich würde das eher per DataInput und DataOuputStream lösen und mir ein eigenes Protokoll überlegen. In deinem Fall könnte zu erst die Anzahl der SpriteMessages die gesendet werden sollen als int geschrieben werden und danach von jeder einzelnen SpriteMessage die 3 relevanten ints geschrieben werden.
 

chaostheory

Bekanntes Mitglied
Zunächst hatte ich auch die Lösung, aber als ich immer mehr unterschiedliche Datentypen hatte habe ich den ObjectInputStream genutzt, der frisst ja alles.
Das wird aber wohl die bessere Lösung sein, ich versuche das mal.
 

irgendjemand

Top Contributor
Wie meinst du das, Strings verschicken? Du meinst ich versende String-Arrays und die Strings sehen dann in etwa so aus: x;y;number ?

so in etwa ... weil eine klasse schreiben ... nur um darin 3 ints zu halten ... das ist absoluter overkill ...
dafür kannst du dann auch wirklich DataInput/OutputStream verwenden und die ints direkt schreiben ... spart auf jeden fall CPU last und traffic
 

chaostheory

Bekanntes Mitglied
Da das alles über TCP läuft muss ich mir dann auch keinerlei Sorgen über falsche Reihenfolge oder Pakete machen, richtig? Ich muss also keine Fehler abfangen (Abgesehen von Exceptions natürlich), oder?
 

irgendjemand

Top Contributor
kennst du google und wikipedia ? dann nutze bitte diese um dir deine zuletzt gestellten fragen selbst zu beantworten ... denn die antwort darauf findet man in den jeweiligen spezifikationen
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Socket Problem mit ObjectInput/OutputSream Netzwerkprogrammierung 5
I Socket Problem mit den WebSocket Antworten der Discord API Netzwerkprogrammierung 0
K Java Websocketserver Problem | Android to Pi Netzwerkprogrammierung 1
C RMI Produzent-Verbraucher-Problem - Code review Netzwerkprogrammierung 12
B Socket Bilder verschicken via Sockets. Heap-Problem. Netzwerkprogrammierung 2
S Problem bei dem Bluetoothverbindungsaufbau Netzwerkprogrammierung 2
G Server-Client IO Problem Netzwerkprogrammierung 6
M Netty - TCP Problem Netzwerkprogrammierung 4
L Socket Problem mit Server Netzwerkprogrammierung 1
J Chat Server starten über GUI problem Netzwerkprogrammierung 4
M Problem bei Socket (MultiplayerSpiel) Netzwerkprogrammierung 4
M Socket CDI, Websocket reference Problem ! Netzwerkprogrammierung 2
Shams Problem mit Eventbus in Verbindung mit Server Netzwerkprogrammierung 0
G apache httpClient Problem. Netzwerkprogrammierung 5
H Problem mit ObjectStreams Netzwerkprogrammierung 3
A Problem beim Senden von Client zu Server Netzwerkprogrammierung 10
D Socket BufferedWriter/Reader Problem Netzwerkprogrammierung 1
Maxim6394 Problem mit Socks5 Implementierung Netzwerkprogrammierung 0
C Handle Connection Problem Netzwerkprogrammierung 3
E HttpUrlConnection Cookie Problem Netzwerkprogrammierung 0
X Problem mit vielen Bytes über Socket Netzwerkprogrammierung 23
O 4Gewinnt Multiplayer - Netzwerk Problem (TCP) Netzwerkprogrammierung 1
A Socket Socket-Problem - Object wird nicht übertragen Netzwerkprogrammierung 3
R Problem beim Programmieren eines Chatprogramms Netzwerkprogrammierung 5
E einfaches Problem: Session-Handling bei Servlets Netzwerkprogrammierung 5
G Problem mit einem FileWatcher Netzwerkprogrammierung 7
T Socket Server starten Thread Problem Netzwerkprogrammierung 12
B Client/Server Connection Problem Netzwerkprogrammierung 2
G Problem mit STATIC-Verständnis Netzwerkprogrammierung 8
S Umstellung AS400 auf Postgre - Problem beim Arbeiten mit Metadaten Netzwerkprogrammierung 2
J Facelets Include Rendered Problem Netzwerkprogrammierung 2
J Socket Problem mit C++/Java Netzwerkprogrammierung 20
P Problem mit Datagram-Sockets Netzwerkprogrammierung 2
G Socket NIO2 Problem mit AsynchronousSocketChannel beim Schließen Netzwerkprogrammierung 3
G Cookie Verwaltungs Problem nach Login auf InetSeite (Wo utma-Cookie?) Netzwerkprogrammierung 18
B Socket Problem mit Netzwerkchat Netzwerkprogrammierung 21
D RMI Problem beim shutdown von verteilter CORBA-Anwendung Netzwerkprogrammierung 6
Maxim6394 ipv6 Problem Netzwerkprogrammierung 2
Maxim6394 Proxyserver Performance Problem Netzwerkprogrammierung 11
M Problem Client - Server Sockets: .ready() wird nie true! Netzwerkprogrammierung 6
B RMI und Problem mit rmic-Tool Netzwerkprogrammierung 3
C FTP storeFileStream Problem Netzwerkprogrammierung 3
N Problem über http eine Datei zu senden Netzwerkprogrammierung 4
D JavaMail - Mailsabrufen Problem (imap) Netzwerkprogrammierung 12
J HTTP Übersetzung yahoo babelfish - Zeichensatz-Problem Netzwerkprogrammierung 6
D Apache CXF, JAX-WS Problem bei Arrays - einfacher Server Netzwerkprogrammierung 2
M Problem beim Datenempfang Netzwerkprogrammierung 2
X Problem mit Server-Client-Kommunikation Netzwerkprogrammierung 14
M Problem mit Socket-Verbindung Netzwerkprogrammierung 2
N NIO Problem beim speziellen Behandeln von einzelnen Benutzern Netzwerkprogrammierung 13
D Thread problem Netzwerkprogrammierung 3
T Servlets JSP: Tomcat Problem Netzwerkprogrammierung 4
K Client - Server Problem Netzwerkprogrammierung 16
T RMI Problem Client-Server Netzwerkprogrammierung 2
P RMI Stub Problem Netzwerkprogrammierung 3
D Socket UDP Übertragungs Problem Netzwerkprogrammierung 7
I HTTP Post aus html in Java einlesen - Problem Netzwerkprogrammierung 2
I HTTP Post aus html in Java einlesen - Problem Netzwerkprogrammierung 6
D Problem mit ObjectInputStreams Netzwerkprogrammierung 10
D Socket Problem mit InputStreamReader Netzwerkprogrammierung 3
N CRC32 CheckSum Problem bei UDP Netzwerkprogrammierung 2
V Java Mail Api - IMAP Problem Netzwerkprogrammierung 6
P RMI Problem Netzwerkprogrammierung 4
I Problem bei Outputstreamerzeugung in anderer Klasse als Socket Netzwerkprogrammierung 5
S Socket Problem mit Objektübertragung Netzwerkprogrammierung 16
Shoox Reader / Writer Problem Netzwerkprogrammierung 2
S Problem mit 2 Serversockets unter Win XP Netzwerkprogrammierung 7
P Socket Problem mit Netzwerkverbindung über TCP Netzwerkprogrammierung 12
M RMI - Connection Problem Netzwerkprogrammierung 7
J Socket Client - Server Problem Netzwerkprogrammierung 4
M Socket Chat-Client-Problem Netzwerkprogrammierung 8
D Client Server Problem, Methode readline() löst SocketException "Connection reset" aus Netzwerkprogrammierung 8
E HTTP Problem beim Auslesen von Websiten Netzwerkprogrammierung 6
T Problem bei Findung der richtigen Architektur Netzwerkprogrammierung 3
AlexSpritze Authentication Problem bei WebServices Netzwerkprogrammierung 4
J Socket Problem -Proxies Netzwerkprogrammierung 2
R HTTP Problem bei Authentifizierung über (Http)UrlConnection Netzwerkprogrammierung 2
F Konzept Problem Netzwerkprogrammierung 12
G NIO Sockets Architektur Problem Netzwerkprogrammierung 2
H Neues NIO problem nachricht an alle clients Netzwerkprogrammierung 3
J Client server problem Netzwerkprogrammierung 3
S Problem bzgl. Sockets / Server-Client-Struktur Netzwerkprogrammierung 3
W RMI Problem Netzwerkprogrammierung 4
M Problem mit Server Netzwerkprogrammierung 5
N Socket Java server c# client problem Netzwerkprogrammierung 7
Y Problem mit ObjectInputStream beim lesen vom Socket Netzwerkprogrammierung 10
R RMI Hibernate Problem Netzwerkprogrammierung 4
Z RMI Problem Netzwerkprogrammierung 11
F RMI problem mit RMI Netzwerkprogrammierung 3
H Object Cast Problem nach Übertragung mit Log4j Netzwerkprogrammierung 5
H Log4j SocketAppender Problem Netzwerkprogrammierung 2
P HTTP Problem beim Download von einer Datei Netzwerkprogrammierung 4
P Problem mit JOscarLib Netzwerkprogrammierung 6
0din SMTP Client - readline problem Netzwerkprogrammierung 4
C komisches Problem / ObjectInputStream erstellt sich nicht Netzwerkprogrammierung 5
W vista / win server 2003 netzlaufwerk problem Netzwerkprogrammierung 4
W Problem mit HTTP-Dateiübertragung Netzwerkprogrammierung 6
E Problem: netbeans 6.5 und webanwendung Netzwerkprogrammierung 6
C Problem mit Übertragung einer Klasse in RMI Netzwerkprogrammierung 10
B UDP Problem Netzwerkprogrammierung 25

Ähnliche Java Themen

Neue Themen


Oben