Я запустил эту систему оповещения с несколькими потоками чата, и я успешно получил несколько клиентов на сервере, но при широковещательной рассылке сообщения всем он взаимодействует только с первоначальным клиентом, отправляющим сообщение, и только с сервером, другой клиент не получить сообщение. Вот коды, с которыми я работаю
Client 1
package popup;
import java.io.*;
import java.net.*;
import javax.swing.*;
public class ClientJFrame extends javax.swing.JFrame {
static Socket s;
static DataInputStream din;
static DataOutputStream dout;
public ClientJFrame() {
super("Client 1");
initComponents();
}
private void alertButtonActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
try {
String msgout = "Alert client 1\n";
dout.writeUTF(msgout);
} catch (Exception e) {
}
}
public static void main(String args[]) {
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new ClientJFrame().setVisible(true);
}
});
try {
s = new Socket("127.0.0.1", 111);
din = new DataInputStream(s.getInputStream());
dout = new DataOutputStream(s.getOutputStream());
String msgin = "";
while (true) {
msgin = din.readUTF();
messageArea.append(msgin);
JOptionPane.showMessageDialog(null, "BITCH WE ON FIRE");
s.close();
System.exit(0);
}
} catch (Exception e) {
}
}
// Variables declaration - do not modify
private javax.swing.JButton alertButton;
private javax.swing.JScrollPane jScrollPane1;
private static javax.swing.JTextArea messageArea;
// End of variables declaration
}
Сервер
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
public class TestJFrame extends javax.swing.JFrame {
static ServerSocket listener;
static Socket s;
private static final int PORT = 111;
public TestJFrame() {
super("Main");
initComponents();
}
public static class Handler extends Thread {
private final Socket socket;
private DataInputStream in;
private DataOutputStream out;
public Handler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
in = new DataInputStream(socket.getInputStream());
messageArea.append("in\n");
out = new DataOutputStream(socket.getOutputStream());
messageArea.append("Out\n");
} catch (IOException e) {
}
while (true) {
try {
String input = in.readUTF();
messageArea.append(input);
out.writeUTF("We on Fire!!!\n");
} catch (IOException ex) {
Logger.getLogger(TestJFrame.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
public static void main(String args[]) throws IOException, InterruptedException {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new TestJFrame().setVisible(false);
createAndShowGUI();
}
});
listener = new ServerSocket(PORT);
try {
while (true) {
new Handler(listener.accept()).start();
}
} finally {
listener.close();
}
}
// Variables declaration - do not modify
private javax.swing.JButton alertButton;
private javax.swing.JScrollPane jScrollPane1;
private static javax.swing.JTextArea messageArea;
// End of variables declaration
}
Не желая рекламировать свой собственный код, в последние недели я разработал базовый многопользовательский чат для сокетов ... Он определенно не идеален, но работает, и если вы посмотрите на Room.java и, возможно, User.java, вы увидите один из возможных способов как транслировать сообщения ...



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Когда клиент подключается к серверу, добавьте его в список, чтобы вы всегда знали, кто подключен. То же самое происходит, когда он отключается.
Когда клиент отправляет сообщение, обрабатывайте его, как хотите, затем перебирайте список подключенных клиентов и отправляйте им сообщение.
Взгляните на образец наблюдателя, я думаю, это поможет вашему проекту.
Подводя итог, можно сказать, что у вас есть многопоточный tcp-сервер, который обрабатывает несколько клиентов одновременно разными потоками ... Если приходит сообщение, сервер печатает его на
JMessageArea?! (Кстати, вы должны выполнить этот код в EDT), но отправив только строку «We on Fire !!! \ n» обратно источнику / клиенту ... Если вы хотите, чтобы сервер транслировал сообщение, вы должны удерживать список подключений, что-то вродеList <Socket> clients;, а затем итерация по немуfor(Socket socket : clients) { socket.getOutputStream().write(...) };...