Так что я работал над игрой Tic-Tac-Toe 2 игрока в java, которая использует сокеты. Весь материал сокета работает, и я успешно отправляю данные между двумя клиентами и сервером.Вопрос с отправкой объекта через java-сокеты
У меня есть следующие классы: Requester, Provider и TBoard (который расширяет Serializable).
В классе Requester (клиент) я создаю объект TBoard (TBoard board = new TBoard()
).
Затем я отправляю этот объект через сокет моим двум клиентам через выходной поток.
Ошибка я получаю на стороне клиента, и это: Exception in thread "main" java.lang.ClassCastException: java.lang.String
Что происходит с:
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");
}
Мой метод print_board() в классе TBoard предназначается, чтобы возвращать 2d, но прямо сейчас (упрощение), у меня есть метод, возвращающий строку «Привет» ...
Кто-нибудь знает, почему это может произойти? Я не хотел бомбардировать вас всем кодом, но, пожалуйста, дайте мне знать, если вам будет полезно больше сообщений ...
Спасибо!
UPDATE:
Вот что я собираюсь на (более подробно) с моим провайдером (сервер) Класс:
// 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);
Так что я действительно посылает строку в потоках перед отправкой последнего объекта (платы). Тем не менее, я промываю потоки заранее. Я также попытался выполнить сброс() после флешей, и он все еще дал мне IllegalCastException ...
добавить еще один catch для ClassCastException. Подобно catch (ClassCastException CCE) {CCE.printStackTrace(); } и покажем нам первую строку результата. Я хочу точно знать, в чем причина проблемы. – NawaMan
Он так говорит в вопросе. Я тоже забыл об этом –