繁体   English   中英

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

[英]How to automatically update server and client side in java

我正在学习分布式系统的基础知识,目前我正在尝试在一个服务器和一个客户端之间做一个简单而现实的消息传递程序。 我要做的是在每个端点套接字端(服务器和客户端)上的文本自动更新(就像一个真正的“消息传递应用程序”) 换句话说,我希望在我编写并“发送”消息时,该消息自动出现在接收方。 我现在遵循的是这种模式:

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

我的代码:

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);
        }
    }
}

我怎样才能做到这一点? 它是否涉及此事的高级知识? 提前致谢。

核心问题是要等待两个事件同时出现 - 可能是从套接字消息,或者来自用户的输入!

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

要“等待”来自多个流的消息,您需要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());
    }
}

一些有用的随机链接:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM