如何在java中自动更新服务器端和客户端

时间:2017-01-06 22:56:26

标签: java sockets distributed-system

我正在学习分布式系统基础知识,目前我正在尝试在一个服务器和一个客户端之间做一个简单而逼真的信使。 我的意图是在每个端点套接字端(服务器和客户端)文本自动更新(如真正的“消息传递应用程序”)。换句话说,我希望在我写“发送”消息的那一刻,它会自动出现在接收方。我现在遵循这个模式:

  1. 我发送消息(让我们假设来自客户)
  2. 要在服务器端查看该消息,我需要先回复(因为服务器的BufferedReader /客户端的PrintWriter只在询问答案后才会被读取)
  3. 我的代码:

    public class ClientSide {
        public static void main(String [] args){
            String host_name = args[0];
            int port_number = Integer.parseInt(args[1]);
    
            try {
                Socket s = new Socket(host_name, port_number);
    
                PrintWriter out =
                        new PrintWriter(s.getOutputStream(), true);
    
                BufferedReader in = 
                        new BufferedReader(
                            new InputStreamReader(s.getInputStream()));
    
                BufferedReader stdIn = 
                        new BufferedReader(
                            new InputStreamReader(System.in));
    
    
                String answer;
    
                while ((answer = stdIn.readLine()) != null) {
                    out.println(answer);
                    System.out.println("\nlocalhost said\n\t" + in.readLine());
                }
    
            } catch (IOException ex) {
                Logger.getLogger(ClientSide.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    
    
    public class ServerSide {
        public static void main(String [] args){
            int port_number = Integer.parseInt(args[0]);
    
            try {
                ServerSocket ss = new ServerSocket(port_number);
                Socket tcp = ss.accept();
    
                PrintWriter out = 
                        new PrintWriter(tcp.getOutputStream(), true);
    
                BufferedReader in =
                        new BufferedReader(
                            new InputStreamReader(tcp.getInputStream()));
    
                BufferedReader stdIn = 
                        new BufferedReader(
                            new InputStreamReader(System.in));
    
                String answer;
                while ((answer = stdIn.readLine()) != null){
                    out.println(answer);
                    System.out.println("\nClient said\n\t" + in.readLine());
                }
    
            } catch (IOException ex) {
                Logger.getLogger(ServerSide.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    

    我该怎么做?它是否涉及有关此事的高级知识? 提前致谢。

1 个答案:

答案 0 :(得分:0)

核心问题是您要同时等待两个事件 - 来自套接字的消息或来自用户的输入!

您希望同时等待两者 - 如果用户键入消息,您不希望等待套接字中的消息;当您从网络收到新消息时,也不会等待用户消息。

要“等待”来自多个流的消息,您有java.nio。我相信这是最正确的正确方式。

但是,如果您想继续使用BufferedReader,当{并且仅当有消息等待阅读时,有ready()方法返回true

instdIn声明之后的代码看起来会像(我没有测试!!):

while(true) {
    if(stdIn.ready()) {
        System.out.println("I said " + stdIn.readLine());
    }
    if(in.ready()) (
        System.out.println("He said " + in.readLine());
    }
}

一些有用的随机链接: