Сокеты Java - Как отправить сообщение с клиента c1 на сервер s, а затем с s на клиент c2 - PullRequest
0 голосов
/ 15 мая 2018

у меня такая ситуация:

2 клиента: c1, c2

1 сервер: s

Мне нужно отправить сообщение m от c1 до s, а затем мне нужно, чтобы s отправляло уведомление c2. Я использую Java Sockets. Код, который я имею, довольно прост, чтобы послать сообщение от c1 до s:

Сервер

try {
    ServerSocket listener = new ServerSocket(9090);
    System.out.println("Server ready to accept connections");
        while (true) {
            Socket socket = listener.accept();
            try {
                BufferedReader in =
                        new BufferedReader(
                                new InputStreamReader(socket.getInputStream()));
                Scanner x = new Scanner(in);
                System.out.println("Client has sent :");
                while (x.hasNextLine()){
                    System.out.println(x.nextLine());
                }
                PrintWriter out =
                        new PrintWriter(socket.getOutputStream(), true);
                out.println("OK");
                out.flush();
            } catch (Exception ex) {
                System.out.println(ex.getLocalizedMessage());
            }
                finally
            {
                socket.close();
            }
        }
    }catch (Exception ex){
        System.out.println(ex.getLocalizedMessage());
    }

Клиент

Socket s = null;
    try {
        s = new Socket("localhost", 9090);
    } catch (IOException e) {
        System.out.println(e.getLocalizedMessage());
    }
    try {
        PrintWriter out =
                new PrintWriter(s.getOutputStream(), true);
        out.println("Random Text");
        out.flush();
        s.shutdownOutput();
        //out.close();
    } catch (IOException e) {
        System.out.println(e.getLocalizedMessage());
    }
    BufferedReader input = null;
    try {
        input = new BufferedReader(new InputStreamReader(s.getInputStream()));
    } catch (IOException e) {
        System.out.println(e.getLocalizedMessage());
    }
    Scanner y = new Scanner(input);
    String answer = "";
    while (y.hasNextLine()) {
        answer = answer.concat(y.nextLine());
    }
    System.out.println("Answer :");
    System.out.println(answer);
    System.out.println(answer);

Теперь, как я могу отредактировать мой код, чтобы сделать то, что я сказал? Большое спасибо!

1 Ответ

0 голосов
/ 15 мая 2018

Поскольку вы пытаетесь общаться между клиентами, вы должны использовать потоки для этого. Итак, как это будет работать, вы должны захватить обоих клиентов и поместить их в один поток.

public static void startServer() {
    ExecutorService executorService = Executors.newFixedThreadPool(2);
    ServerSocket server = new ServerSocket(9090);
    executorService.execute(() -> {
       Socket client1 = server.accept();
       Socket client2 = server.accept();
       executorService.execute(new ServerConnection(client1, client2));
    });
}

Класс ServerConnection будет принимать двух клиентов (Socket), которые вы можете использовать для обмена данными между клиентом и сервером. Представьте себе ServerConnection как данные, поступающие от клиентов, и сервер будет реагировать соответствующим образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...