Клиент Java Socket получает устаревший сериализованный объект, несмотря на то, что сервер отправляет обновленную версиюJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Клиент Java Socket получает устаревший сериализованный объект, несмотря на то, что сервер отправляет обновленную версию

Сообщение Anonymous »

Я пытаюсь создать небольшую многопользовательскую покерную игру для моих друзей, которая использует базовые функции Java, такие как Swing и Socket, но я не могу заставить клиентскую сторону правильно обновлять. Игра предназначена для обновления, чтобы показать, что каждый игроки движутся, когда их действие выбирается, и показать всем игрокам в игре, когда присоединятся новые игроки, но я не могу заставить предыдущих клиентов обновлять, только самый последний. Я использую самые последние версии IntelliJ и JDK, а я тестирую сервер и клиента на одной и той же машине. Когда я печатаю объект, он говорит, что на панели есть 2 игрока, нарисованные на него до его отправки, но когда мой клиент получает его, на ней говорится только один игрок.public void updateGamePanel(DrawPanel newPanel) {
System.out.println(newPanel.toString()+" recived... Updating...");
Container contentPane = frame.getContentPane();
contentPane.removeAll();
contentPane.setLayout(new BorderLayout());

contentPane.add(newPanel, BorderLayout.CENTER);

contentPane.invalidate();
contentPane.validate();
contentPane.repaint();

frame.setSize(1000, 700);
frame.setVisible(true);
}
< /code>
Метод обновления на сервере: < /p>
public void updateAllClients() {
DrawPanel panel = new DrawPanel(table);

System.out.println("Updating all clients: " + table.size() + " players at table.");
Iterator iter = playerThreads.iterator();
while (iter.hasNext()) {
PlayerHandler handler = iter.next();
try {
System.out.println(panel+" SERVER SENT");
handler.updatePlayer(panel);
} catch (Exception e) {
iter.remove(); // remove broken connections
System.out.println("Removed disconnected player handler.");
}
}
}
< /code>
Метод обновления на классе обработчика потока < /p>
public void updatePlayer(DrawPanel panel) {
try {
if (output != null) {
output.writeObject(panel);
output.flush();
System.out.println("Sent updated "+panel.toString()+" to player.");
}
} catch (IOException e) {
e.printStackTrace();
}
}
< /code>
Полный класс на стороне клиента: < /p>
package Poker.Server;

import Poker.Client.Player;
import Poker.Utils.DrawPanel;

import javax.swing.*;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;

public class PokerServer {
private ArrayList table;
public int minBet;
public static final PokerServer server = new PokerServer(new ArrayList(), 0);
public static final int MAX_PLAYERS=10;
private final ArrayList playerThreads=new ArrayList();
private PokerServer(ArrayList table, int minBet) {
this.table = table;
this.minBet = minBet;
}

public JPanel getPanel() {
return new DrawPanel(table);
}

public static void main(String[] args) {
try (ServerSocket serverSocket = new ServerSocket(5000)) {
System.out.println("Poker Server is running on port 5000...");

while (true) {
Socket clientSocket = serverSocket.accept();
ObjectOutputStream out= new ObjectOutputStream(clientSocket.getOutputStream());
out.flush();
ObjectInputStream input=new ObjectInputStream(clientSocket.getInputStream());
out.writeObject(new String("Player Number #"+server.table.size()));
if (server.playerThreads.size() >= MAX_PLAYERS) {
out.writeObject(new String("Too many players"));
clientSocket.close();
continue;
}

PlayerHandler handler = new PlayerHandler(clientSocket,out,input);
server.playerThreads.add(handler);
new Thread(handler).start();

System.out.println("New player connected. Current: " + server.playerThreads.size());
}
} catch (IOException e) {
e.printStackTrace();
}
}

public DrawPanel createFrame(){
return new DrawPanel(table);
}

public void addPlayer(Player play){
table.add(play);
updateAllClients();
}

public void removePlayer(Player play) {
table.remove(play);
updateAllClients(); // Notify all clients that a player has left
}

public void updateAllClients() {
DrawPanel panel = new DrawPanel(table);

System.out.println("Updating all clients: " + table.size() + " players at table.");
Iterator iter = playerThreads.iterator();
while (iter.hasNext()) {
PlayerHandler handler = iter.next();
try {
System.out.println(panel+" SERVER SENT");
handler.updatePlayer(panel);
} catch (Exception e) {
iter.remove(); // remove broken connections
System.out.println("Removed disconnected player handler.");
}
}
}

}
< /code>
Полный код сервера < /p>
package Poker.Server;

import Poker.Client.Player;
import Poker.Utils.DrawPanel;

import javax.swing.*;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;

public class PokerServer {
private ArrayList table;
public int minBet;
public static final PokerServer server = new PokerServer(new ArrayList(), 0);
public static final int MAX_PLAYERS=10;
private final ArrayList playerThreads=new ArrayList();
private PokerServer(ArrayList table, int minBet) {
this.table = table;
this.minBet = minBet;
}

public JPanel getPanel() {
return new DrawPanel(table);
}

public static void main(String[] args) {
try (ServerSocket serverSocket = new ServerSocket(5000)) {
System.out.println("Poker Server is running on port 5000...");

while (true) {
Socket clientSocket = serverSocket.accept();
ObjectOutputStream out= new ObjectOutputStream(clientSocket.getOutputStream());
out.flush();
ObjectInputStream input=new ObjectInputStream(clientSocket.getInputStream());
out.writeObject(new String("Player Number #"+server.table.size()));
if (server.playerThreads.size() >= MAX_PLAYERS) {
out.writeObject(new String("Too many players"));
clientSocket.close();
continue;
}

PlayerHandler handler = new PlayerHandler(clientSocket,out,input);
server.playerThreads.add(handler);
new Thread(handler).start();

System.out.println("New player connected. Current: " + server.playerThreads.size());
}
} catch (IOException e) {
e.printStackTrace();
}
}

public DrawPanel createFrame(){
return new DrawPanel(table);
}

public void addPlayer(Player play){
table.add(play);
updateAllClients();
}

public void removePlayer(Player play) {
table.remove(play);
updateAllClients(); // Notify all clients that a player has left
}

public void updateAllClients() {
DrawPanel panel = new DrawPanel(table);

System.out.println("Updating all clients: " + table.size() + " players at table.");
Iterator iter = playerThreads.iterator();
while (iter.hasNext()) {
PlayerHandler handler = iter.next();
try {
System.out.println(panel+" SERVER SENT");
handler.updatePlayer(panel);
} catch (Exception e) {
iter.remove(); // remove broken connections
System.out.println("Removed disconnected player handler.");
}
}
}

}
< /code>
Полный код обработчика игрока: < /p>
package Poker.Server;

import Poker.Client.Player;
import Poker.Utils.DrawPanel;

import java.io.*;
import java.net.Socket;

class PlayerHandler implements Runnable {
private Socket socket;
private ObjectOutputStream output;
private ObjectInputStream input;
private Player player;

public PlayerHandler(Socket socket,ObjectOutputStream output, ObjectInputStream input) {
this.socket = socket;
this.input=input;
this.output=output;
}

@Override
public void run() {
try {
try {
player = (Player) input.readObject();
System.out.println("Received player: " + player.getName());
PokerServer.server.addPlayer(player);
System.out.println("Player: " + player);

// Initial DrawPanel after join
// updatePlayer(PokerServer.server.createFrame());

// Keep the thread alive, waiting for server-side updates.
while (!socket.isClosed()) {
Object obj = input.readObject(); // Block until input received
// You can implement client-side messages if needed, e.g., "ping" or "action"
System.out.println("Received message from client: " + obj);
}

} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
PokerServer.server.removePlayer(player); // Add this if you want disconnect logic
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

// This method will send a DrawPanel object to the client
public void updatePlayer(DrawPanel panel) {
try {
if (output != null) {
output.writeObject(panel);
output.flush();
System.out.println("Sent updated "+panel.toString()+" to player.");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

< /code>
Панель Game Class: < /p>
package Poker.Utils;

import Poker.Client.Player;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;

public class DrawPanel extends JPanel implements Serializable {
private final ArrayList table;

public static final Color crimson = new Color(220, 20, 60);
public static final Color deepSkyBlue = new Color(0, 191, 255);
public static final Color mediumSeaGreen = new Color(60, 179, 113);
public static final Color goldenrod = new Color(218, 165, 32);
public static final Color orchid = new Color(218, 112, 214);
public static final Color slateBlue = new Color(106, 90, 205);
public static final Color tomato = new Color(255, 99, 71);
public static final Color sandyBrown = new Color(244, 164, 96);
public static final Color darkKhaki = new Color(189, 183, 107);
public static final Color mediumPurple = new Color(147, 112, 219);
public static final Color[] colors = {crimson, deepSkyBlue, mediumSeaGreen, goldenrod, orchid, slateBlue, tomato, sandyBrown, darkKhaki, mediumPurple};

public static BufferedImage userIcon;

static {
try {
userIcon = ImageIO.read(new File("Assets/icon.png"));
} catch (IOException e) {
e.printStackTrace();
}
}

public DrawPanel(ArrayList table) {
this.table = table;

}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);

int panelWidth = 1000;
int panelHeight = 600;

// Table setup
int centerX = panelWidth / 2;
int centerY = panelHeight / 2;
int tableWidth = 450;
int tableHeight = 300;
int semiCircleRadius = tableHeight / 2;

// Draw table: rectangle + semicircles
g.setColor(Color.GREEN);
g.fillRect(centerX - tableWidth / 2, centerY - tableHeight / 2, tableWidth, tableHeight);
g.fillArc(centerX - tableWidth / 2 - semiCircleRadius, centerY - semiCircleRadius, tableHeight, tableHeight, 90, 180);
g.fillArc(centerX + tableWidth / 2 - semiCircleRadius, centerY - semiCircleRadius, tableHeight, tableHeight, 270, 180);

// Seat array
int[][] seats = new int[10][2];
int seatRadius = 30;

// === Top 3 seats — moderate spread ===
int topY = centerY - tableHeight / 2 - seatRadius - 20;
int offsetX = tableWidth / 2; // moderate spacing (less than before)

seats[0][0] = centerX - offsetX; // left seat
seats[0][1] = topY;

seats[1][0] = centerX;
seats[1][1] = topY;

seats[2][0] = centerX + offsetX; // right seat
seats[2][1] = topY;

// === Right 2 seats on semicircle — pushed away ===
int extraDistance = 50;
double rightCenterX = centerX + tableWidth / 2;
double rightCenterY = centerY;

for (int i = 0; i < 2; i++) {
double angle = Math.toRadians(30 - i * 60); // 45°, -45°
int x = (int) (rightCenterX + (semiCircleRadius + extraDistance) * Math.cos(angle));
int y = (int) (rightCenterY + (semiCircleRadius + extraDistance) * Math.sin(angle));
seats[4-i][0] = x;
seats[4-i][1] = y;
}

// === Bottom 3 seats — moderate spread ===
int bottomY = centerY + tableHeight / 2 + seatRadius + 45;

seats[7][0] = centerX - offsetX; // left seat
seats[7][1] = bottomY;

seats[6][0] = centerX;
seats[6][1] = bottomY;

seats[5][0] = centerX + offsetX; // right seat
seats[5][1] = bottomY;

// === Left 2 seats on semicircle — pushed away ===
double leftCenterX = centerX - tableWidth / 2;
double leftCenterY = centerY;

for (int i=0;i

Подробнее здесь: https://stackoverflow.com/questions/796 ... sending-up
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»