The question is, how can I send messages to all users in the chat, and not just to the one who sent it? Prompt, preferably without an auxiliary class that handles connections
import java.io.*; import java.net.Socket; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Server extends Thread{ private PrintWriter printWriter; private BufferedReader bufferedReader; private Socket socket; private static List<MyClient>clients = Collections.synchronizedList(new ArrayList<>()); private MyClient client; public Server(Socket socket) { this.socket = socket; try { bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); printWriter = new PrintWriter(socket.getOutputStream(), true); } catch (IOException e) { e.printStackTrace(); } } @Override public void run() { try { whileChating(); } catch (IOException e) { e.printStackTrace(); }finally { closeConnection(); } } private void whileChating() throws IOException { String message = "SERVER msg: you are connecting " + socket.getInetAddress() + " : " + socket.getPort(); printWriter.println(message + "\r\n"); do { message = bufferedReader.readLine(); printWriter.println("Сообщение получил"); printWriter.println(message); System.out.println(message); }while (!message.equals("EXIT")); } private void closeConnection(){ System.out.println("Закрыите соединения"); printWriter.println("Пользователь отключился \r\n"); try { printWriter.close(); bufferedReader.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } Server startup:
import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class ServerRun { public static void main(String[] args) { try (ServerSocket serverSocket = new ServerSocket(5656, 25)) { while (true){ Socket socket = serverSocket.accept(); new Server(socket).start(); } }catch (IOException e){ e.printStackTrace(); } } } Customer:
import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.*; import java.net.InetSocketAddress; import java.net.Socket; public class MyClient extends JFrame { private JTextField userInputText; private JTextArea chatWindow; private PrintWriter printWriter; private BufferedReader bufferedReader; private Socket socket; public MyClient(){ super("Client"); userInputText = new JTextField(); userInputText.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { sendMessage(e.getActionCommand()); userInputText.setText(""); } }); add(userInputText, BorderLayout.NORTH); chatWindow = new JTextArea(); chatWindow.setEditable(false); add(new JScrollPane(chatWindow), BorderLayout.CENTER); setSize(300, 600); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); startClient(); } private void startClient() { try { connectServer(); whileChating(); }catch (EOFException e){ showMessage("Клиент оборвал соединение"); }catch (IOException e){ e.printStackTrace(); }finally { closeConnection(); } } private void connectServer() throws IOException { showMessage("Connecting..."); socket = new Socket(); socket.connect(new InetSocketAddress("127.0.0.1", 5656), 2000); printWriter = new PrintWriter(socket.getOutputStream(), true); bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); showMessage("Connection ready"); } private void whileChating() throws IOException { String message; do { message = bufferedReader.readLine(); showMessage("\n" + message); }while (!message.equals("EXIT")); } private void closeConnection(){ showMessage("\nClose connection..."); try { printWriter.close(); bufferedReader.close(); socket.close(); } catch (IOException e) { e.getMessage(); } } public void sendMessage(String message){ printWriter.println(message); } private void showMessage(String msg){ SwingUtilities.invokeLater(new Runnable() { @Override public void run() { chatWindow.append(msg); } }); } } Tell me how to add clients to the collection in order to send them messages.