Java套接字 - 如何将消息从客户端c1发送到服务器s,然后从s发送到客户端c2

时间:2018-05-15 18:24:23

标签: java sockets server notifications client

我遇到这种情况:

2个客户:c1,c2

1 server:s

我需要从c1发送消息m到s,然后我需要s向c2发送通知消息。 我正在使用Java套接字。 我的代码非常简单,可以将消息从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 :(得分:0)

由于您尝试在客户端之间进行通信,因此必须使用线程来执行此操作。所以它将如何工作将是你必须捕获两个客户端并将它们放在同一个线程中。

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视为来自客户端的数据,服务器将做出相应的反应。