当前位置: 首页 > news >正文

JavaFX、贷款服务器

 


服务器:

package net;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TextArea;
import javafx.stage.Stage;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Exercise31_01Server extends Application {
    private ExecutorService executor = Executors.newFixedThreadPool(5);     //线程池(管理线程数量)
    private TextArea textArea = new TextArea();         //文本区域(显示信息)
    private static final int SERVER_PORT = 8000;        //端口号

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        //文本区域(设置属性)
        textArea.setPrefColumnCount(40);
        textArea.setPrefRowCount(10);
        textArea.setEditable(false);

        Scene scene = new Scene(new ScrollPane(textArea));
        primaryStage.setScene(scene);
        primaryStage.setTitle("Exercise31_01Server");
        primaryStage.show();

        //启动线程
        new Thread(this::startServer).start();
    }

    /** 启动服务器 */
    private void startServer() {
        try {
            //创建服务器套接字
            ServerSocket server = new ServerSocket(SERVER_PORT);
            Platform.runLater(() -> textArea.appendText(this.getClass().getSimpleName() + " started at " + new Date() + "\n"));

            while (true) {
                //创建套接字(连接客户端)
                Socket socket = server.accept();
                Platform.runLater(() -> textArea.appendText("Connected to a client at " + new Date() + "\n"));

                //为连接的客户端分配一个线程
                executor.execute(new HandleClient(socket));
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            executor.shutdown();
        }
    }

    /** 内部类-处理一个客户端 */
    private class HandleClient implements Runnable {
        private Socket socket;  //连接客户端的套接字

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

        @Override
        public void run() {
            //输入、输出流
            DataInputStream inputFromClient = null;
            DataOutputStream outputToClient = null;

            try {
                inputFromClient = new DataInputStream(socket.getInputStream());
                outputToClient = new DataOutputStream(socket.getOutputStream());

                while (true) {
                    //获取客户端数据
                    double annualInterestRate = inputFromClient.readDouble();
                    int numberOfYears = inputFromClient.readInt();
                    double loanAmount = inputFromClient.readDouble();
                    double monthlyRate = annualInterestRate / 1200;
                    double monthlyPayment = loanAmount * monthlyRate / (1 - 1 / Math.pow(1 + monthlyRate, numberOfYears * 12));
                    double totalPayment = monthlyPayment * 12 * numberOfYears;

                    //写数据到客户端
                    outputToClient.writeDouble(monthlyPayment);
                    outputToClient.writeDouble(totalPayment);
                    Platform.runLater(() ->
                        textArea.appendText("Annual Interest Rate: " + annualInterestRate + "\n" +
                                "Number of Year: " + numberOfYears + "\n" +
                                "Loan Amount: " + loanAmount + "\n" +
                                "monthlyPayment: " + monthlyPayment + "\n" +
                                "totalPayment: " + totalPayment + "\n\n"));
                }
            } catch (IOException ex) {
                textArea.appendText(ex.getMessage());
            } finally {
                try {   //关闭流
                    if (inputFromClient != null) inputFromClient.close();
                    if (outputToClient != null) outputToClient.close();
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        }
    }
}

客户端:

package net;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

public class Exercise31_01Client extends Application {
    private TextField annualInterestRate = new TextField();     //年利息率
    private TextField numberOfYears = new TextField();          //年数
    private TextField loanAmount = new TextField();             //贷款数量
    private Button submit = new Button("Submit");               //提交
    private TextArea message = new TextArea();                  //文本区域(显示信息)
    private static final String HOST = "localhost";             //主机/IP地址
    private static final int SERVER_PORT = 8000;                //端口号

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        //总面板
        BorderPane pane = new BorderPane(new ScrollPane(message));
        pane.setTop(getTopPane());

        //文本区域设置属性
        message.setPrefRowCount(6);
        message.setPrefColumnCount(30);
        message.setEditable(false);

        //按钮设置动作事件
        submit.setOnAction(event -> handleSubmit());

        Scene scene = new Scene(pane);
        primaryStage.setScene(scene);
        primaryStage.setTitle("Exercise31_01Client");
        primaryStage.show();
    }

    /** 返回顶部面板 */
    private GridPane getTopPane() {
        //网格面板(放置文本域)
        GridPane pane = new GridPane();
        pane.setStyle("-fx-hgap: 10px; -fx-vgap: 5px;");
        pane.addRow(0, new Label("Annual Interest Rate:"), annualInterestRate);
        pane.addRow(1, new Label("Number of Years:"), numberOfYears);
        pane.addRow(2, new Label("Loan Amount:"), loanAmount);
        pane.add(submit, 2, 1);

        //文本域设置属性
        annualInterestRate.setAlignment(Pos.BOTTOM_RIGHT);
        numberOfYears.setAlignment(Pos.BOTTOM_RIGHT);
        loanAmount.setAlignment(Pos.BOTTOM_RIGHT);
        annualInterestRate.setPrefColumnCount(13);
        numberOfYears.setPrefColumnCount(13);
        loanAmount.setPrefColumnCount(13);

        return pane;
    }

    /** 提交信息给服务器 */
    private void handleSubmit() {
        Socket socket = null;                   //客户端套接字
        DataInputStream inputFromServer = null; //输入流
        DataOutputStream outputToServer = null; //输出流

        try {
            socket = new Socket(HOST, SERVER_PORT);
            inputFromServer = new DataInputStream(socket.getInputStream());
            outputToServer = new DataOutputStream(socket.getOutputStream());

            double annualInterestRate = Double.parseDouble(this.annualInterestRate.getText().trim());
            int numberOfYears = Integer.parseInt(this.numberOfYears.getText().trim());
            double loanAmount = Double.parseDouble(this.loanAmount.getText().trim());

            //发送数据到服务器
            outputToServer.writeDouble(annualInterestRate);
            outputToServer.writeInt(numberOfYears);
            outputToServer.writeDouble(loanAmount);

            //接受服务器数据
            double monthlyPayment = inputFromServer.readDouble();
            double totalPayment = inputFromServer.readDouble();
            Platform.runLater(() ->
                    message.appendText("Annual Interest Rate: " + annualInterestRate + "\n" +
                            "Number of Year: " + numberOfYears + "\n" +
                            "Loan Amount: " + loanAmount + "\n" +
                            "monthlyPayment: " + monthlyPayment + "\n" +
                            "totalPayment: " + totalPayment + "\n\n"));
            this.annualInterestRate.setText("");
            this.numberOfYears.setText("");
            this.loanAmount.setText("");
        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            try {       //关闭与服务器的连接
                if (socket != null) socket.close();
                if (inputFromServer != null) inputFromServer.close();
                if (outputToServer != null) outputToServer.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }
}

 

 

相关文章:

  • Powershell历史执行记录
  • elementui中表格组件的高度修改没效果
  • 难受啊,早饭忘记吃了
  • 标签上有什么defer和async属性?<script>
  • 放大器的稳定性分析举例
  • ipsec vxn详解
  • Redis实战:保证数据不丢失,RDBAOF持久化原理解析
  • 总共300万嘞,成都市武侯区关于促进电子商务发展的若干政策出来了
  • Linux·设备文件devfs
  • MySQL in和exists 查询分析
  • 使用easyui-treegrid数据层级展示问题
  • 讲真的!身为一个合格的码农,谁还没碰过索引失效呢
  • 来自鹅厂大神级架构师把Tomcat内核设计解析完了
  • 总蛋白提取丨Abbkine ExKine总蛋白提取试剂盒及文献引用说明
  • Faster R-CNN pytorch版
  • 【comparator, comparable】小总结
  • 2017年终总结、随想
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • HTML5新特性总结
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • JS+CSS实现数字滚动
  • Python 反序列化安全问题(二)
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • Vim Clutch | 面向脚踏板编程……
  • vue 个人积累(使用工具,组件)
  • VUE es6技巧写法(持续更新中~~~)
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 分布式熔断降级平台aegis
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 简单易用的leetcode开发测试工具(npm)
  • 前端存储 - localStorage
  • 微信开源mars源码分析1—上层samples分析
  • 用quicker-worker.js轻松跑一个大数据遍历
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • ###项目技术发展史
  • #AngularJS#$sce.trustAsResourceUrl
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (02)vite环境变量配置
  • (6)STL算法之转换
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (二)linux使用docker容器运行mysql
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (十三)Flask之特殊装饰器详解
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)可以带来幸福的一本书
  • .apk文件,IIS不支持下载解决
  • .equals()到底是什么意思?
  • .libPaths()设置包加载目录
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .net分布式压力测试工具(Beetle.DT)
  • .NET中使用Redis (二)
  • /etc/fstab和/etc/mtab的区别
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面