Frage mit sendende Objekt über java-sockets
Also ich habe auf einer 2-Spieler-Tic-Tac-Toe-Spiel in java mit sockets. Alle socket-Zeug funktioniert, und ich bin das senden von Daten hin und her erfolgreich zwischen 2 clients und einem server.
Habe ich die folgenden Klassen: - Requester -, Provider -, und TBoard (das reicht Serializable).
In der Requester (client) Klasse instanziiere ich ein Objekt von TBoard (TBoard board = new TBoard()
).
Ich senden Sie dieses Objekt über den socket an meine zwei Kunden, die über einen output-stream.
Den Fehler bin ich immer auf der client-Seite, und es ist: Exception in thread "main" java.lang.ClassCastException: java.lang.String
Geschieht mit:
board = (TBoard) in.readObject(); in:
do {
try {
board = (TBoard) in.readObject();
System.out.println(board.print_board());
} catch (ClassNotFoundException classNot) {
System.err.println("data received in unknown format");
}
Meine print_board () - Methode in der TBoard-Klasse gemeint ist, die Rückkehr ein 2d-array, aber für jetzt (Vereinfachung Zwecke), habe ich die Methode der Rückgabe der string "Hallo"...
Weiß jemand, warum dies passiert? Ich wollte nicht bombardieren Sie alle mit code, aber bitte lassen Sie mich wissen, wenn die Buchung mehr hilfreich sein können...
Dank!
UPDATE:
Hier ist, was ich habe, geht auf (im detail) mit meinem Provider (server) Klasse:
//1. creating a server socket
providerSocket = new ServerSocket(20092);
//2. Wait for connection
System.out.println("Waiting for connection...");
connection1 = providerSocket.accept();
System.out.println("Connection received from Player 1 " +
connection1.getInetAddress().getHostName());
connection2 = providerSocket.accept();
System.out.println("Connection received from Player 2 " + connection2.getInetAddress().getHostName());
//3. get Input and Output streams
out = new ObjectOutputStream(connection1.getOutputStream());
out2 = new ObjectOutputStream(connection2.getOutputStream());
in = new ObjectInputStream(connection1.getInputStream());
out.writeObject("Player 1 has been connected successfully.");
in2 = new ObjectInputStream(connection2.getInputStream());
out2.writeObject("Player 2 has been connected successfully.");
out.flush();
out2.flush();
out.writeObject(board);
out2.writeObject(board);
So, ich bin ja senden einer Zeichenfolge in den Bächen vor dem senden das Letzte Objekt (board). Aber ich bin ausspülen die streams vorher. Ich habe auch versucht, reset()'s nach den flushes, und es gab mir noch die IllegalCastException...
- fügen Sie eine weitere zu fangen classcastexception-Fehler. Wie catch(classcastexception-Fehler CCE) { CCE.printStackTrace(); } und zeigen Sie uns die ersten paar Zeile des Ergebnisses. Ich möchte wissen, für sicher, was der Linie zu Problemen führen
- Er sagt, so in der Frage - habe ich übersehen, dass auf den ersten als auch
Du musst angemeldet sein, um einen Kommentar abzugeben.
IIRC, die Klasse in der erwähnten Ausnahme ist die eine, die wurde tatsächlich gefunden, so in den code, den Sie sind zeigt, der Fehler müsste hier sein:
- Und ein String-Objekt, anstatt ein TBoard Lesen aus dem stream.
Edit:
Damit Sie sind senden von Zeichenfolgen zusätzlich zu den Daten. Es ist Ihr problem. Sie haben entweder zu stoppen senden Sie diese Zeichenfolgen, oder Lesen Sie auf der empfangenden Seite vor dem Lesen der Daten. Aufruf
flush()
unerheblich ist, dass - es stellt sicher, dass die Zeichenfolgen, die Sie bereits geschrieben haben, um die Streams sind in der Tat die über die Verbindung gesendet und nicht gehalten in einem Puffer.Untersuchen, ich denke, das einfachste wäre, zu visualisieren (log oder debug) die eigentliche Klasse, die das Ergebnis
in.readObject()
. Beispiel-code:Gibt es ein paar Möglichkeiten. Vorausgesetzt, Sie sind mit ObjectOutputStream (was ich glaube), ist es möglich, dass der Fehler entsteht, weil Sie nicht vollständig serialisieren jedes Objekt. ObjectOutputStream wird versuchen und halten des zurücksendens, wenn Sie nicht zurücksetzen der stream jedes mal.
Ich würde Folgendes versuchen:
1) stellen Sie sicher, dass Sie flush() und close() des sockets auf die entsprechenden Zeiten
2) versuchen Sie, aufrufen von reset() nach jedem Objekt gesendet.
3) überprüfen Sie, dass Sie senden und empfangen, die den gleichen Objekttyp, nur für den Fall.
viel Glück.