模拟Server/Client进程通信

一、服务器端

ServerSocket serverSocket = new ServerSocket(8080);//创建服务器套接字,
Socket socket = serverSocket.accept();//并等待连接

二、客户端

Socket socket = new Socket("localhost",8080);//创建套接字并通过该套接字向服务器发送请求连接

客户端代码:

public class Client extends Application{
    //初始化驶入输出流
    DataOutputStream outputStream = null;
    DataInputStream inputStream = null;
    @Override
    public void start(Stage primaryStage) throws Exception {
        BorderPane pane = new BorderPane();
        pane.setPadding(new Insets(10,10,10,10));
        pane.setLeft(new Label("输入半径: "));

        TextField tf = new TextField();
        tf.setAlignment(Pos.BOTTOM_LEFT);
        pane.setCenter(tf);

        BorderPane mainPane = new BorderPane();
        TextArea ta = new TextArea();
        mainPane.setCenter(new ScrollPane(ta));
        mainPane.setTop(pane);

        Scene scene = new Scene(mainPane,450,200);
        primaryStage.setTitle("Client");
        primaryStage.setScene(scene);
        primaryStage.show();

        try {
            Socket socket = new Socket("localhost",8080);
            inputStream = new DataInputStream(socket.getInputStream());
            outputStream = new DataOutputStream(socket.getOutputStream());

        }catch (IOException e){
            System.err.println(e);
        }

        tf.setOnAction(e->{
            try{
                double radius = Double.parseDouble(tf.getText().trim());
                outputStream.writeDouble(radius);
                outputStream.flush();
                double area = inputStream.readDouble();

                ta.appendText("半径: "+radius+"\n");
                ta.appendText("从服务器得到的面积: "+area+"\n");
            }catch (IOException ex){
                ta.appendText(ex.toString()+"\n");
            }
        });
    }
}

服务器端代码:

public class MultiThreadServer extends Application{
    private TextArea ta = new TextArea();
    private int clientNo = 0;
    @Override
    public void start(Stage primaryStage) throws Exception {
        Scene scene = new Scene(new ScrollPane(ta),450,200);
        primaryStage.setTitle("Server");
        primaryStage.setScene(scene);
        primaryStage.show();

        new Thread(()->{//ServerSocket accept()方法执行的时候花费时间,不应放在JavaFX程序线程中运行,因此放在一个独立的线程中
            try{
                //服务器套接字
                ServerSocket serverSocket = new ServerSocket(8080);
                ta.appendText("服务器开始工作: "+new Date().toString()+"\n");
                while (true){
                    //等待连接
                    Socket socket = serverSocket.accept();
                    clientNo++;

                    Platform.runLater(()->{
                        ta.appendText("第 "+clientNo+" 个客户端连接成功: "+new Date().toString()+"\n");

                        InetAddress inetAddress = socket.getInetAddress();
                        ta.appendText("客户端"+clientNo+"的主机名为:"+inetAddress.getHostName()+"\n");
                        ta.appendText("客户端"+clientNo+"的地址为:"+inetAddress.getHostAddress()+"\n");
                    });
                    //创建一个新线程处理通信
                    new Thread(new HandleAClient(socket)).start();
                }
            }catch (IOException e){
                e.printStackTrace();
            }
        }).start();

    }
    class HandleAClient implements Runnable{
        private Socket socket;

        public HandleAClient(Socket socket) {
            this.socket = socket;
        }

        @Override
        public void run() {
            try {
                //创建输入输出流接受客户端的数据
                DataInputStream inputStream = new DataInputStream(socket.getInputStream());
                DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream());
                while (true){
                    double radius = inputStream.readDouble();
                    double area = radius*radius*Math.PI;
                    outputStream.writeDouble(area);

                    Platform.runLater(()->{
                        ta.appendText("客户端发过来的半径:"+radius+"\n");
                        ta.appendText("服务器发出去的面积:"+area+"\n");
                    });
                }

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}




猜你喜欢

转载自blog.csdn.net/qq_34198877/article/details/79768952