Я пытаюсь создать небольшую многопользовательскую покерную игру для моих друзей, которая использует базовые функции 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
Клиент Java Socket получает устаревший сериализованный объект, несмотря на то, что сервер отправляет обновленную версию ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Сервер Node.js Socket IO отключает клиент Python Socket.io через 30 секунд
Anonymous » » в форуме Python - 0 Ответы
- 59 Просмотры
-
Последнее сообщение Anonymous
-