Drekel Ответов: 0

Связь между двумя клиентами и одним сервером в javafx


я часто пытаюсь общаться между двумя клиентами (ClientA. Сервер. ClientB)
Если ClientA отправляет сообщение, оно отправляется на сервер, а затем сервер отправляет его обратно в ClientA вместо отправки этого сообщения в ClientB. то же самое с ClientB оба клиента не могут общаться друг с другом, но могут подключаться к серверу.

Что я уже пробовал:

серверный код

public class MultiUserChatServer {

    static List clientList;

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        clientList = new ArrayList();
        System.out.println("Server Started\nWaiting For Client Connection");
        try {
            ServerSocket serSock = new ServerSocket(2018);
            while (true) {
                Socket sock = serSock.accept();
                ServerThread s = new ServerThread(sock);
                s.start();
                clientList.add(s);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static class ServerThread extends Thread {

        private final Socket sock;
        private DataInputStream dataIn;
        private DataOutputStream dataOut;

        public ServerThread(Socket sock) {
            this.sock = sock;
        }

        @Override
        public void run() {
            try {
                dataIn = new DataInputStream(sock.getInputStream());
                dataOut = new DataOutputStream(sock.getOutputStream());

                String line;
                while (sock.isConnected()) {
                    line = dataIn.readUTF();
                    for (int i = 0; i < MultiUserChatServer.clientList.size(); i++) {
                        dataOut.writeUTF(line);
                        dataOut.flush();
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}


Клиентский Код (Класс Контроллера)

public class FXMLDocumentController implements Initializable {

    @FXML
    private Label label;
    @FXML
    private JFXTextArea textArea;
    @FXML
    private JFXTextField textField;
    private Socket sock;
    private DataInputStream dataIn;
    private DataOutputStream dataOut;

    @FXML
    private void sendAction(ActionEvent event) {
        try {
            dataOut.writeUTF(textField.getText());
            textArea.appendText("You: " + textField.getText() + "\n");
            dataOut.flush();
            textField.clear();
        } catch (Exception e) {e.printStackTrace();
        }
    }

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        new ClientThread().start();
        label.setText("Connected");
    }

    private class ClientThread extends Thread {

        @Override
        public void run() {
            try {
                sock = new Socket(InetAddress.getLocalHost(), 2018);
                dataOut = new DataOutputStream(sock.getOutputStream());
                dataIn = new DataInputStream(sock.getInputStream());

                while (true) {
                    textArea.appendText(dataIn.readUTF() + "\n");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }
}


Что я здесь делаю не так?

0 Ответов