本习题来自《java语言程序设计--进阶篇》第30章,网络编程的习题。

题目描述:为一个客户端编写一个服务器。客户端向服务器发送贷款信息(年利率、贷款年限和贷款总额)。服务器计算月偿还额和总偿还额,并把它们发回给客户端。将客户端程序命名为:Exercise30_1Client,将服务器程序命名为Exercise30_1Server。

package exercise.chapter30;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;

/*
 * 贷款客户端
 * 日期:2015.5.17
 */

public class Exercise30_1Client extends JFrame {
	private JPanel center = new JPanel();
	private JPanel south = new JPanel();

	private JTextArea jta = new JTextArea(8, 10);
	private JButton jbt = new JButton("Submit");

	//创建标签和文本域
	private JLabel jlb1 = new JLabel("税率");
	private JTextField rate = new JTextField();
	private JLabel jlb2 = new JLabel("贷款年数");
	private JTextField year = new JTextField();
	private JLabel jlb3 = new JLabel("贷款总数");
	private JTextField amount = new JTextField();

	public Exercise30_1Client() {
		//设计GUI布局
		center.setLayout(new GridLayout(3, 2));
		south.setLayout(new BorderLayout());

		center.add(jlb1);
		center.add(rate);
		center.add(jlb2);
		center.add(year);
		center.add(jlb3);
		center.add(amount);

		jta.setEditable(false);
		jta.setFont(new Font("", Font.BOLD, 15));
		south.add(new JScrollPane(jta), BorderLayout.CENTER);
		south.add(jbt, BorderLayout.EAST);

		this.setLayout(new BorderLayout());
		this.add(center, BorderLayout.CENTER);
		this.add(south, BorderLayout.SOUTH);

		this.setTitle("Exercise30_1Client");
		this.setSize(400, 300);
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		//设计socket
		try {
			Socket socket = new Socket("localhost", 8000);
			jbt.addActionListener(new MyActionListener(socket));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

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

	private class MyActionListener implements ActionListener {
		Socket socket = null;

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

		@Override
		public void actionPerformed(ActionEvent arg0) {
			try {
				DataOutputStream output = new DataOutputStream(socket.getOutputStream());
				DataInputStream input = new DataInputStream(socket.getInputStream());
				double rateStr = Double.parseDouble(rate.getText().trim());
				double yearStr = Double.parseDouble(year.getText().trim());
				double amountStr = Double.parseDouble(amount.getText().trim());
				String message = rateStr + "@" + yearStr + "@" + amountStr;

				output.write(message.getBytes());
				output.flush();

				byte[] buf = new byte[1024];
				int len = 0;

				//文本域清零
				rate.setText("");
				year.setText("");
				amount.setText("");

				double amount = input.readDouble();
				//向jta中追加数据
				jta.append("税率: " + rateStr + ", 贷款年数:" + yearStr + ", 贷款总额: " +
						amountStr + " ,偿还总额:" + amount);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}
import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.net.*;
import java.util.*;
/*
 *功能:贷款服务器
 *日期:2015.5.17
 */

public class Exercise30_1Server extends JFrame {
	private JTextArea jta = new JTextArea();

	public Exercise30_1Server() {
		this.setTitle("Exercise30_1Server");
		this.setSize(400, 300);
		this.setResizable(false);
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		jta.setFont(new Font("Font.ITALIC",Font.PLAIN, 15));
		jta.setEditable(false);
		this.setLayout(new BorderLayout());
		this.add(new JScrollPane(jta), BorderLayout.CENTER);

		jta.append("Server started at " + new Date() + '\n');

		try {
			ServerSocket ss = new ServerSocket(8000);
			Socket socket = ss.accept();

			//获取InetAddress类
			InetAddress inetAddress = socket.getInetAddress();
			jta.append("Client's hostname is: " + inetAddress.getHostName());
			jta.append("\n");
			jta.append("Client's ip is: " + inetAddress.getHostAddress());
			jta.append("\n");

			DataInputStream input = new DataInputStream(socket.getInputStream());
			DataOutputStream output = new DataOutputStream(socket.getOutputStream());
			byte[] buf = new byte[1024];
			int len = 0;
			while((len = input.read(buf)) != -1) {
				double amount = getAmount(new String(buf, 0, len));
				output.writeDouble(amount);

				jta.append(new String(buf, 0, len));
				jta.append("\n");
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private static double getAmount(String str) {
		String[] str1 = str.split("@");

		double rate = Double.parseDouble(str1[0]);
		double years = Double.parseDouble(str1[1]);
		double amount = Double.parseDouble(str1[2]);

		return rate * years * amount + amount;
	}

	public static void main(String[] args) {
		JFrame frame = new Exercise30_1Server();
	}
}

java GUI,贷款服务器的更多相关文章

  1. Java 之 web服务器—Tomcat

    一.服务器 1.服务器 服务器:安装了服务器软件的计算机 2.服务器软件 服务器软件:接收用户的请求,处理请求,做出响应 3.Web 服务器软件 web 服务器软件:接收用户的请求,处理请求,做出响应 ...

  2. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  3. JAVA GUI

    JAVA GUI中的事件处理:   委托事件模型:事件源对象和监听器对象具有绑定关系   一个监听器可以绑定多个事件源 一个事件源也可以绑定多个监听器 监听器有各自监听的事件类型   设置容器的布局管 ...

  4. Java获取Web服务器文件

    Java获取Web服务器文件 如果获取的是服务器上某个目录下的有关文件,就相对比较容易,可以设定死绝对目录,但是如果不能设定死绝对目录,也不确定web服务器的安装目录,可以考虑如下两种方式: 方法一: ...

  5. paip.java gui swt/jface 最佳实践

    paip.java gui swt/jface 最佳实践 1. 工具:Eclipse +jigloo4 1 2. 安装插件: 1 1. IMPORT swt lib 2 2. 新建立窗体 2 3. 运 ...

  6. 一个java页游服务器框架

    一.前言 此游戏服务器架构是一个单服的形式,也就是说所有游戏逻辑在一个工程里,没有区分登陆服务器.战斗服务器.世界服务器等.此架构已成功应用在了多款页游服务器 .在此框架中没有实现相关业务逻辑,只有简 ...

  7. 写在学习Java GUI之前

    Java GUI就是用Java语言开发桌面应用,而Java又有三个Java GUI库,分别为AWT,Swing和SWT/JFace. 现在要学的是Swing库. 后记:开发桌面应用,不止一种技术,现在 ...

  8. Android中实现java与PHP服务器(基于新浪云免费云平台)http通信详解

    Android中实现java与PHP服务器(基于新浪云免费云平台)http通信详解 (本文转自: http://blog.csdn.net/yinhaide/article/details/44756 ...

  9. JAVA编写WEB服务器

    一.超文本传输协议  1.1 HTTP请求  1.2 HTTP应答  二.Socket类  三.ServerSocket类  四.Web服务器实例  4.1 HttpServer类  4.2 Requ ...

随机推荐

  1. 开源论坛MvcForum推荐

    MvcForum算是Asp.net中开源论坛佼佼者之一.主要使用ASP.NET MVC 5 &Unity & Entity Framework 6,有较强的可撸性.是论坛开发者的不二之 ...

  2. [翻译]:SQL死锁-锁的类型

    很久没有写博客了,这里面的原因有很多.最近的一个项目由于客户明确提出要做下性能压力测试,使用的工具就是VS自带的压力测试工具.以前其它项目做压力测试后反馈的其中一个重要问题就是数据库的死锁.没想到我们 ...

  3. SharpGL学习笔记(十八) 解析3ds模型并显示

    笔者设想的3D仿真中的元件,是不可能都是“画”出来的.这样就玩复杂了,应该把任务分包出去,让善于制作模型的软件来制作三维模型,我们只需要解析并且显示它即可. 3dsmax制作三维模型的方便,快捷,专业 ...

  4. RHEL7文件查找

    本文介绍RHEL7下which.whereis.locate.find命令的使用,重点介绍find命令的使用 which 命令:which 作用:查找命令的执行文件路径 语法:which [选项] [ ...

  5. REUSE_ALV_GRID_DISPLAY显示ALV,设置可编辑时,与内表数据同步问题

    使用function module: REUSE_ALV_GRID_DISPLAY显示ALV,并设置alv某些列可编辑,可是编辑后发现对应的内表数据并没有随之改变.记得需要设置一个参数的值,怎么想也记 ...

  6. 关于在EXCEL中输入01-01-01被转换为2001/1/1怎么解决

    当向EXCEL写入类似'01-01-01'或'01-01'这样的数据时,打开EXCEL时会发现数据变成了2001/1/1和1月1日. 这是由于EXCEL自动转换功能,我们得要在输入前多加一个’号. 而 ...

  7. 收集oracle统计信息

    优化器统计范围: 表统计: --行数,块数,行平均长度:all_tables:NUM_ROWS,BLOCKS,AVG_ROW_LEN:列统计: --列中唯一值的数量(NDV),NULL值的数量,数据分 ...

  8. Java中的继承与组合(转载)

    本文主要说明Java中继承与组合的概念,以及它们之间的联系与区别.首先文章会给出一小段代码示例,用于展示到底什么是继承.然后演示如何通过“组合”来改进这种继承的设计机制.最后总结这两者的应用场景,即到 ...

  9. MacBook Air 使用技巧

    1.Finder             相当于资源管理器 Launchpad       相当于桌面 Safari              浏览器 2.快捷键 * cmd+shift+3: 捕获整 ...

  10. 【转】XCode: duplicate symbol 解决方案

    遇到引用库重复定义的问题,需要解决. 项目需要,同时引用ZBar和QQ授权登录SDK,由于二者均使用了Base64处理数据,XCode编译时报错: duplicate symbol _base64_e ...