• JavaFX、贷款服务器


     


    服务器:

    1. package net;
    2. import javafx.application.Application;
    3. import javafx.application.Platform;
    4. import javafx.scene.Scene;
    5. import javafx.scene.control.ScrollPane;
    6. import javafx.scene.control.TextArea;
    7. import javafx.stage.Stage;
    8. import java.io.DataInputStream;
    9. import java.io.DataOutputStream;
    10. import java.io.IOException;
    11. import java.net.ServerSocket;
    12. import java.net.Socket;
    13. import java.util.Date;
    14. import java.util.concurrent.ExecutorService;
    15. import java.util.concurrent.Executors;
    16. public class Exercise31_01Server extends Application {
    17. private ExecutorService executor = Executors.newFixedThreadPool(5); //线程池(管理线程数量)
    18. private TextArea textArea = new TextArea(); //文本区域(显示信息)
    19. private static final int SERVER_PORT = 8000; //端口号
    20. public static void main(String[] args) {
    21. launch(args);
    22. }
    23. @Override
    24. public void start(Stage primaryStage) {
    25. //文本区域(设置属性)
    26. textArea.setPrefColumnCount(40);
    27. textArea.setPrefRowCount(10);
    28. textArea.setEditable(false);
    29. Scene scene = new Scene(new ScrollPane(textArea));
    30. primaryStage.setScene(scene);
    31. primaryStage.setTitle("Exercise31_01Server");
    32. primaryStage.show();
    33. //启动线程
    34. new Thread(this::startServer).start();
    35. }
    36. /** 启动服务器 */
    37. private void startServer() {
    38. try {
    39. //创建服务器套接字
    40. ServerSocket server = new ServerSocket(SERVER_PORT);
    41. Platform.runLater(() -> textArea.appendText(this.getClass().getSimpleName() + " started at " + new Date() + "\n"));
    42. while (true) {
    43. //创建套接字(连接客户端)
    44. Socket socket = server.accept();
    45. Platform.runLater(() -> textArea.appendText("Connected to a client at " + new Date() + "\n"));
    46. //为连接的客户端分配一个线程
    47. executor.execute(new HandleClient(socket));
    48. }
    49. } catch (IOException ex) {
    50. ex.printStackTrace();
    51. } finally {
    52. executor.shutdown();
    53. }
    54. }
    55. /** 内部类-处理一个客户端 */
    56. private class HandleClient implements Runnable {
    57. private Socket socket; //连接客户端的套接字
    58. public HandleClient(Socket socket) {
    59. this.socket = socket;
    60. }
    61. @Override
    62. public void run() {
    63. //输入、输出流
    64. DataInputStream inputFromClient = null;
    65. DataOutputStream outputToClient = null;
    66. try {
    67. inputFromClient = new DataInputStream(socket.getInputStream());
    68. outputToClient = new DataOutputStream(socket.getOutputStream());
    69. while (true) {
    70. //获取客户端数据
    71. double annualInterestRate = inputFromClient.readDouble();
    72. int numberOfYears = inputFromClient.readInt();
    73. double loanAmount = inputFromClient.readDouble();
    74. double monthlyRate = annualInterestRate / 1200;
    75. double monthlyPayment = loanAmount * monthlyRate / (1 - 1 / Math.pow(1 + monthlyRate, numberOfYears * 12));
    76. double totalPayment = monthlyPayment * 12 * numberOfYears;
    77. //写数据到客户端
    78. outputToClient.writeDouble(monthlyPayment);
    79. outputToClient.writeDouble(totalPayment);
    80. Platform.runLater(() ->
    81. textArea.appendText("Annual Interest Rate: " + annualInterestRate + "\n" +
    82. "Number of Year: " + numberOfYears + "\n" +
    83. "Loan Amount: " + loanAmount + "\n" +
    84. "monthlyPayment: " + monthlyPayment + "\n" +
    85. "totalPayment: " + totalPayment + "\n\n"));
    86. }
    87. } catch (IOException ex) {
    88. textArea.appendText(ex.getMessage());
    89. } finally {
    90. try { //关闭流
    91. if (inputFromClient != null) inputFromClient.close();
    92. if (outputToClient != null) outputToClient.close();
    93. } catch (Exception ex) {
    94. ex.printStackTrace();
    95. }
    96. }
    97. }
    98. }
    99. }

    客户端:

    1. package net;
    2. import javafx.application.Application;
    3. import javafx.application.Platform;
    4. import javafx.geometry.Pos;
    5. import javafx.scene.Scene;
    6. import javafx.scene.control.*;
    7. import javafx.scene.layout.BorderPane;
    8. import javafx.scene.layout.GridPane;
    9. import javafx.stage.Stage;
    10. import java.io.DataInputStream;
    11. import java.io.DataOutputStream;
    12. import java.io.IOException;
    13. import java.net.Socket;
    14. public class Exercise31_01Client extends Application {
    15. private TextField annualInterestRate = new TextField(); //年利息率
    16. private TextField numberOfYears = new TextField(); //年数
    17. private TextField loanAmount = new TextField(); //贷款数量
    18. private Button submit = new Button("Submit"); //提交
    19. private TextArea message = new TextArea(); //文本区域(显示信息)
    20. private static final String HOST = "localhost"; //主机/IP地址
    21. private static final int SERVER_PORT = 8000; //端口号
    22. public static void main(String[] args) {
    23. launch(args);
    24. }
    25. @Override
    26. public void start(Stage primaryStage) {
    27. //总面板
    28. BorderPane pane = new BorderPane(new ScrollPane(message));
    29. pane.setTop(getTopPane());
    30. //文本区域设置属性
    31. message.setPrefRowCount(6);
    32. message.setPrefColumnCount(30);
    33. message.setEditable(false);
    34. //按钮设置动作事件
    35. submit.setOnAction(event -> handleSubmit());
    36. Scene scene = new Scene(pane);
    37. primaryStage.setScene(scene);
    38. primaryStage.setTitle("Exercise31_01Client");
    39. primaryStage.show();
    40. }
    41. /** 返回顶部面板 */
    42. private GridPane getTopPane() {
    43. //网格面板(放置文本域)
    44. GridPane pane = new GridPane();
    45. pane.setStyle("-fx-hgap: 10px; -fx-vgap: 5px;");
    46. pane.addRow(0, new Label("Annual Interest Rate:"), annualInterestRate);
    47. pane.addRow(1, new Label("Number of Years:"), numberOfYears);
    48. pane.addRow(2, new Label("Loan Amount:"), loanAmount);
    49. pane.add(submit, 2, 1);
    50. //文本域设置属性
    51. annualInterestRate.setAlignment(Pos.BOTTOM_RIGHT);
    52. numberOfYears.setAlignment(Pos.BOTTOM_RIGHT);
    53. loanAmount.setAlignment(Pos.BOTTOM_RIGHT);
    54. annualInterestRate.setPrefColumnCount(13);
    55. numberOfYears.setPrefColumnCount(13);
    56. loanAmount.setPrefColumnCount(13);
    57. return pane;
    58. }
    59. /** 提交信息给服务器 */
    60. private void handleSubmit() {
    61. Socket socket = null; //客户端套接字
    62. DataInputStream inputFromServer = null; //输入流
    63. DataOutputStream outputToServer = null; //输出流
    64. try {
    65. socket = new Socket(HOST, SERVER_PORT);
    66. inputFromServer = new DataInputStream(socket.getInputStream());
    67. outputToServer = new DataOutputStream(socket.getOutputStream());
    68. double annualInterestRate = Double.parseDouble(this.annualInterestRate.getText().trim());
    69. int numberOfYears = Integer.parseInt(this.numberOfYears.getText().trim());
    70. double loanAmount = Double.parseDouble(this.loanAmount.getText().trim());
    71. //发送数据到服务器
    72. outputToServer.writeDouble(annualInterestRate);
    73. outputToServer.writeInt(numberOfYears);
    74. outputToServer.writeDouble(loanAmount);
    75. //接受服务器数据
    76. double monthlyPayment = inputFromServer.readDouble();
    77. double totalPayment = inputFromServer.readDouble();
    78. Platform.runLater(() ->
    79. message.appendText("Annual Interest Rate: " + annualInterestRate + "\n" +
    80. "Number of Year: " + numberOfYears + "\n" +
    81. "Loan Amount: " + loanAmount + "\n" +
    82. "monthlyPayment: " + monthlyPayment + "\n" +
    83. "totalPayment: " + totalPayment + "\n\n"));
    84. this.annualInterestRate.setText("");
    85. this.numberOfYears.setText("");
    86. this.loanAmount.setText("");
    87. } catch (IOException ex) {
    88. ex.printStackTrace();
    89. } finally {
    90. try { //关闭与服务器的连接
    91. if (socket != null) socket.close();
    92. if (inputFromServer != null) inputFromServer.close();
    93. if (outputToServer != null) outputToServer.close();
    94. } catch (Exception ex) {
    95. ex.printStackTrace();
    96. }
    97. }
    98. }
    99. }

     

     

  • 相关阅读:
    axios基本用法、axios如何发起网络请求?如何二次封装axios?
    【Flink】基本转换算子使用之fliter、flatMap,键控流转换算子和分布式转换算子
    【Linux】环境变量
    Java 程序设计报告[对接java的迭代器接口]
    设备自动化系统EAP在晶圆厂的关键作用
    UE4 Forward平面反射小记
    深度学习—cv动物/植物数据集
    5、DVWA——文件上传
    行业现状?互联网公司为什么宁愿花20k招人,也不愿涨薪留住老员工~
    redis使用rightPushAll保存List,List的size为1
  • 原文地址:https://blog.csdn.net/m0_62659797/article/details/126622613