У меня есть класс ServerMain с ServerThreads. Каждый раз, когда клиент подключается, создается 1 новый ServerThread. Я хочу, чтобы каждый клиент отправлял строку [], содержащую порт и координаты, которые сохраняются в LinkedHashMap, а затем сервер должен отправлять клиентам LinkedHashMap со всеми портами и координатами других клиентов. Но оказывается, что каждый клиент отправляет строку [] в другой ServerThread, который отличается от LinkedHashMap. Как сделать так, чтобы каждый клиент отправлял один LinkedHashMap, а сервер отправлял всем клиентам этот LinkedHashMap?
public class Main extends JFrame {
private static final long serialVersionUID = 1L;
private JTextArea chatWindow;
private List<Integer> ports = new ArrayList<Integer>();
public Main() throws IOException {
super("ServerConsole");
chatWindow = new JTextArea();
chatWindow.setEditable(false);
JScrollPane scrollPane = new JScrollPane(chatWindow);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scrollPane.setBounds(0, 20, 596, 200);
add(scrollPane);
setLayout(null);
setSize(600, 300);
setResizable(false);
setVisible(true);
getContentPane().setBackground(Color.white);
Socket s = null;
ServerSocket ss2 = null;
showMessage("Server Listening......");
try {
ss2 = new ServerSocket(3175); // can also use static final PORT_NUM
// , when defined
} catch (IOException e) {
e.printStackTrace();
showMessage("Server error");
}
while (true) {
try {
s = ss2.accept();
showMessage("connection Established\n");
ports.add(s.getPort());
ServerThread st = new ServerThread(s);
st.start();
}
catch (Exception e) {
e.printStackTrace();
showMessage("Connection Error");
}
}
}
private void showMessage(final String m) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
chatWindow.append(m);
}
});
}
}
class ServerThread extends Thread {
private ObjectOutputStream output;
private ObjectInputStream input;
Socket s = null;
private LinkedHashMap<Integer, String> playerCoords = new LinkedHashMap<Integer, String>();
public ServerThread(Socket s) {
this.s = s;
}
public void run() {
try {
input = new ObjectInputStream(s.getInputStream());
output = new ObjectOutputStream(s.getOutputStream());
} catch (IOException e) {
System.out.println("IO error in server thread");
}
String[] message = new String[] { "" };
try {
while (message[0] != "234124214") {
message = (String[]) input.readObject();
if (message[0] != null) {
playerCoords.put(Integer.parseInt(message[0]), message[1]);
output.writeObject(playerCoords);
output.flush();
} else {
output.writeObject(Integer.toString(s.getPort()));
output.flush();
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void closeWindow() throws IOException {
input.close();
output.close();
s.close();
System.out.println("Connection Closed");
}
}