写再前面的话:
1,本文为Java学习五部分第一部分所有项目回顾(快递e站部分-对应Java体系第一部分第三阶段-13-网络)网络编程那里我同样也没有把练习作业写上,当然不止这一个练习作业。又不是所有的练习和项目都值得发博客。哪些作业在网盘里都有对应体现。
2,整体项目系列博客(包括整体快递e站系列)
3,完整的Java体系链接(比你想的更多的Java内容)
需求介绍:
涉及到的知识点:
上一版:
面向对象+集合+IO
这一版:
面向对象+集合+IO+多线程+网络编程
代码运行成功截图:
一,同时开启服务端与客户端
二,在客户端存入快递2
三,关闭客户端并重新开启
四,两个客户端登录
思路分析:
上一版的流程图如下:
以上一个快递 E 栈系统04(数组+面向对象+集合+IO)为基础讲一下这个。
这次改动的比较大,
1,首先test取消了
2,bean层不变
3,dao层大改动:
3.1变量上:快递类的list集合表示链表的初始位置,创建了整个项目存储数据的文件(静态私有不可变变量)
3.2初始化数据里的确定快递柜大小去掉,直接再创建变量时确定了。
3.3对于以前的逻辑进行了很多改动(这里看代码就能知道,也都好理解,附录:dao层结构图)
4,view层这个可以去掉了。我当时忘记删除了。他的概况:
5,main层为主要改动部分,因为要用多线程,所以分为服务端与客户端。
server:
client:
6,异常类和IO层没有改动
总流程:
代码
bean层
package com.wyh.rewu.bean;
import java.io.Serializable;
/**
* 快递实体类
*/
public class Express implements Serializable {
private String number; // 单号
private String company; // 快递公司
private int code; // 取件码
// 坐标
public Integer x;
public Integer y;
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public Integer getX() {
return x;
}
public void setX(Integer x) {
this.x = x;
}
public Integer getY() {
return y;
}
public void setY(Integer y) {
this.y = y;
}
public Express() {
}
public Express(String number, String company, int code, Integer x, Integer y) {
this.number = number;
this.company = company;
this.code = code;
this.x = x;
this.y = y;
}
@Override
public String toString() {
return "Expresss{" +
"number='" + number + '\'' +
", company='" + company + '\'' +
", code=" + code +
", x=" + x +
", y=" + y +
'}';
}
}
dao层
package com.wyh.rewu.dao;
import com.wyh.rewu.bean.Express;
import com.wyh.rewu.util.IOUtil;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class ExpressDao{
//链表的初始设置
private static List<Express> expressList = new ArrayList<>(100);
//存储快递的文件名
public static final String FILE_NAME = "快递信息.txt";
//静态 代码块
static {
File file = new File(FILE_NAME);
if (!file.exists()){
//如果文件不存在,创建文件
try {
if (file.createNewFile()){
//创建文件名为FILE_NAME的文件
System.out.println("第一次启动项目,创建储存文件成功!");
}
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
//初始化数据
public void Dao() {
//从文件中读取数据
try {
Object obj = IOUtil.readFile(FILE_NAME);
if (obj!=null && obj instanceof List){
expressList = (List<Express>) obj;
}
}catch (IOException | ClassNotFoundException e) {
System.out.println(e.getMessage());
}
}
/**
* 获得快递的所有信息
* @return
*/
public static List<Express> getExpressList() {
return expressList;
}
/**
* 添加快递
* @param express
* @return
* @throws Exception
*/
public static Express add(Express express) throws Exception {
Random random = new Random();
if (expressList.size() == 100) {
System.out.println("快递柜已存满!");
return null;
}
int x, y;
do {
x = random.nextInt(10);
y = random.nextInt(10);
} while (isExist(x, y));
int code;
do {
code = random.nextInt(900000) + 100000;
} while (isExistCode(code));
express.setCode(code);
express.setX(x);
express.setY(y);
expressList.add(express);
IOUtil.wirteFile(expressList,FILE_NAME);//更新文档中的数据
return express;
}
/**
* 添加快递中,判断当前位置是否已经存在快递
* @param x
* @param y
* @return
*/
public static boolean isExist(int x, int y) {
for (Express express : expressList) {
if (express.getX() == x && express.getY() == y) {
return true;
}
}
return false;
}
/**
* 判断取件码是否已经存在
* @param code
* @return
*/
public static boolean isExistCode(int code) {
for (Express express : expressList) {
if (express.getCode() == code) {
return true;
}
}
return false;
}
/**
* 根据快递单号查找快递,如果不存在返回-1
* @param number
* @return
*/
public static int findByNumber(String number) {
int i = 0;
for (Express express : expressList) {
if (number.equals(express.getNumber())) {
return i;
}
i++;
}
return -1;
}
/**
* 删除快递
* @param number
* @return
* @throws Exception
*/
public static boolean delete(String number) throws Exception {
int index = findByNumber(number);
if (index == -1) {
return false;
}
expressList.remove(index);//删除快递的操作
IOUtil.wirteFile(expressList,FILE_NAME);
return true;
}
/**
* 更新快递
* @param number
* @param newExpress
* @return
* @throws Exception
*/
public static boolean update(String number, Express newExpress) throws Exception {
int index = findByNumber(number);
if (index == -1) {
System.out.println("快递不存在!");
return false;
}
Express express1 = expressList.get(index);
express1.setNumber(newExpress.getNumber());
express1.setCompany(newExpress.getCompany());
IOUtil.wirteFile(expressList,FILE_NAME);//数据加入