package eZhan_Map_IO_CS;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
public class Server {
private ServerSocket server;
private final int PORT = 8080;
static ExpressDao dao = new ExpressDao();
static Views v = new Views();
public static void main(String[] args) {
Server server = new Server();
server.start();
}
public void start(){
int i = 0;
try {
server = new ServerSocket(PORT);
System.out.println("服务器已启动");
while (true) {
i++;
Socket socket = server.accept();
System.out.println("====已经有" + i + "个用户登录====");
new Thread(new Runnable() {
@Override
public void run() {
login(socket);
try {
//将数据存储到文件中
/*dao.adminWrite();
dao.userWrite();*/
dao.expressWrite();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (server != null) {
server.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void login(Socket socket) {
InputStream is = null;
OutputStream os = null;
ObjectInputStream ois = null;
ObjectOutputStream oos = null;
try {
is = socket.getInputStream();
os = socket.getOutputStream();
ois = new ObjectInputStream(is);
oos = new ObjectOutputStream(os);
w:
while (true){
char flag = ois.readChar();
User u = (User) ois.readObject();
if (flag==‘1‘) {//传入1时代表用户身份是管理员
if(dao.adminFindByNameAndByPwd(u)){//判断管理员用户账号密码是否正确
//正确把ture传到客户端
oos.writeObject(true);
oos.flush();
while (true) {
int mune = (int) ois.readObject();
if(mune==0){
break;
}
cClient(mune,oos,ois);
}
break;
}else{
//错误把false传到客户端
oos.writeObject(false);
oos.flush();
continue;
}
}else if(flag==‘2‘){
if(dao.userFindByNameAndByPwd(u)){
//正确把ture传到客户端
oos.writeObject(true);
oos.flush();
while(true){
Boolean b = uClient(oos, ois);
if(b==true){
break w;
}
}
}else{
//错误把false传到客户端
oos.writeObject(false);
oos.flush();
continue;
}
}
}
}catch (Exception e){
e.printStackTrace();
}
}
private static Boolean uClient(ObjectOutputStream oos,ObjectInputStream ois) throws IOException, ClassNotFoundException {
//1. 获取用户输入的取件码
int s = (int) ois.readObject();
//2. 查找快递是否存在
Express e = dao.findBycode(s);
//3. 将查找结果返回客户端:存在返回快递对象,不存在返回null
oos.writeObject(e);
oos.flush();
if(e!=null){
dao.delete(e.getNumber());
return true;
}
return false;
}
public static void cClient(int mune,ObjectOutputStream oos,ObjectInputStream ois) throws Exception {
switch (mune){
case 0:
return;
case 1:{//快递录入
System.out.println(1);
//1. 提示输入快递信息
Express e = (Express) ois.readObject();
//2. 查询单号是否已经存在
Express e2 = dao.findBynumber(e.getNumber());
if(e2==null){
//3. 存储快递
dao.add(e);
oos.writeObject(true);
oos.writeObject(e);
oos.flush();
}else {
oos.writeObject(false);
oos.flush();
}
break;
}
case 2:{//快递修改
System.out.println(2);
//1. 接受要修改的快递的单号
String number = (String) ois.readObject();
//2. 查找快递是否存在
Express e = dao.findBynumber(number);
if(e==null){
oos.writeObject(false);
oos.flush();
}else {
oos.writeObject(true);
oos.writeObject(e);
oos.flush();
Express newe = (Express) ois.readObject();
if(dao.findBynumber(newe.getNumber())==null){
Express e2 = dao.update(e.getNumber(), newe);
oos.writeObject(e2);
} else{
oos.writeObject(null);
}
oos.flush();
}
}
break;
case 3:{//删除
System.out.println(3);
//1. 输入快递单号
String number = (String) ois.readObject();
//2. 查找快递是否存在
Express e = dao.findBynumber(number);
if(e==null){//不存在返回null
oos.writeObject(false);
oos.flush();
}else {//存在将ture和快递对象返回
oos.writeObject(true);
oos.writeObject(e);
oos.flush();
int type = (int) ois.readObject();
if(type == 1){
dao.delete(number);
}
}
}
break;
case 4:{//客户端想查看所有快递
//将存储快递对象的HashMap返回给客户端
System.out.println(4);
HashMap<String,Express> data = dao.findall();
Collection<Express> values = data.values();
ArrayList<Express> expresses1 = new ArrayList<>(values);
Express[] expresses=new Express[expresses1.size()];
data.values().toArray(expresses);
oos.writeObject(expresses);
oos.flush();
}
break;
}
}
}
package eZhan_Map_IO_CS;
import java.io.*;
import java.util.*;
public class ExpressDao implements Serializable{
private HashMap<String, Express> data = new HashMap(100,0.75f);
private HashMap<String, User> user = new HashMap(100,0.75f);
private HashMap<String, User> admin = new HashMap(100,0.75f);
private Collection<Express> values = data.values();
private Collection<User> userValues = user.values();
private Collection<User> adminValues = admin.values();
private Set<String> set = data.keySet();
int size=0;
private static final String EXPRESS_FILE_NAME= "express2.txt";
private static final String ADMIN_FILE_NAME= "admin.txt";
private static final String USER_FILE_NAME= "user.txt";
private static final File userFile = new File(USER_FILE_NAME);
private static final File adminFile = new File(ADMIN_FILE_NAME);
private static final File expressFile = new File(EXPRESS_FILE_NAME);
Random random = new Random();
static{
//需要的某个文件不存在则创建文件
if(!userFile.exists() || adminFile.exists() || expressFile.exists()){
try {
adminFile.createNewFile();
userFile.createNewFile();
expressFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public ExpressDao() {
/*try {
FileOutputStream fos = new FileOutputStream(userFile);
ObjectOutputStream oos = new ObjectOutputStream(fos);
User user1 = new User();
user1.setUsername("user");
user1.setPassword("123");
user.put(user1.getUsername(),user1);
oos.writeObject(user);
oos.flush();
oos = new ObjectOutputStream(new FileOutputStream(adminFile));
User user2 = new User();
user2.setUsername("admin");
user2.setPassword("abc");
admin.put(user2.getUsername(),user2);
oos.writeObject(admin);
oos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}*/
try {
expressRead();
userRead();
adminRead();
values = data.values();
userValues = user.values();
adminValues = admin.values();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 存储快递
* @param e
* @return
*/
public Express add(Express e) throws Exception {
if(size==100){
throw new Exception("快递柜已满!");
}
int x,y;
do {
//1.随机生成两个0-9的数据x和y
x=random.nextInt(10);
y=random.nextInt(10);
}while (isExist(x,y));//生成快递的位置
e.setX(x);
e.setY(y);
int code = randomcode();//生成取件码
e.setCode(code);
size++;//快递数量+1
Express e1 = e;
if(data.put(e.getNumber(),e)==null){//快递不存在data.put()返回null 存在则返回此对象
return e;//存储成功将添加了取件码和位置的快递对象返回
}
return null;
}
/**
* 随机生成100000-999999的随机数
* @return
*/
private int randomcode(){
//生成100000-999999的随机数
while (true){
int code = random.nextInt(900000)+100000;
Express e = findBycode(code);
if(e==null){
return code;
}
}
}
/**
* 根据快递单号查询快递
* @param number
* @return 快递对象
*/
public Express findBynumber(String number){
Express e = data.get(number);//不存在返回null
return e==null?null:e;
}
/**
* 根据取件码查询快递
* @param code
* @return 查询的结果,失败返回null;
*/
public Express findBycode(int code){
for (Express express : values) {
if(express.getCode()==code){
return express;
}
}
return null;
}
/**
* 为了符合MVC做的多余的操作
* @param
* @param newExpress
*/
public Express update(String Number,Express newExpress) throws Exception {
delete(Number);
Express e = add(newExpress);
return e;
}
/**
* 删除快递
* @param Number
*/
public void delete(String Number){
data.remove(Number);
}
public HashMap<String, Express> findall(){
return data;
}
/**
* 判断快递柜的这个位置是否有快递
* @param x
* @param y
* @return
*/
public boolean isExist(int x,int y){
for (Express express:values) {
if(express.getX()==x && express.getY()==y){
return true;
}
}
return false;
}
/**
* 判断是否有这个用户
* @param u
* @return 查找结果
*/
public boolean userFindByNameAndByPwd(User u) {
for (User u1 : userValues) {
if (u.getUsername().equals(u1.getUsername()) && u.getPassword().equals(u1.getPassword())) {
return true;
}
}
return false;
}
/**
* 判断是否有这个管理员
* @param u
* @return 查找结果
*/
public boolean adminFindByNameAndByPwd(User u) {
for (User u1 : adminValues) {
if (u.getUsername().equals(u1.getUsername()) && u.getPassword().equals(u1.getPassword())) {
return true;
}
}
return false;
}
/**
* 读取存储User对象的文件
* 将读取的内容传给 user -- HashMap
* @throws IOException
* @throws ClassNotFoundException
*/
public void userRead() throws IOException, ClassNotFoundException {
if (EXPRESS_FILE_NAME.length() > 0) {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(this.userFile));
user = (HashMap<String,User>) ois.readObject();
ois.close();
}
}
/**
* 将user对象写入文件USER_FINE_NAME
* @throws IOException
*/
public void userWrite() throws IOException {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(this.userFile));
oos.writeObject(this.user);
oos.close();
}
/**
* 读取存储管理员对象的文件
* 将读取的内容传给 admin -- HashMap
* @throws IOException
* @throws ClassNotFoundException
*/
public void adminRead() throws IOException, ClassNotFoundException {
if (EXPRESS_FILE_NAME.length() > 0) {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(this.adminFile));
admin = (HashMap<String,User>) ois.readObject();
ois.close();
}
}
/**
* 将管理员对象写入文件ADMIN_FINE_NAME
* @throws IOException
*/
public void adminWrite() throws IOException {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(this.adminFile));
oos.writeObject(this.admin);
oos.close();
}
/**
* 读取存储快递对象的文件
* 将读取的内容传给 data -- HashMap
* @throws IOException
* @throws ClassNotFoundException
*/
public void expressRead() throws IOException, ClassNotFoundException {
if (expressFile.length()>0) {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(expressFile));
data = (HashMap<String,Express>) ois.readObject();
ois.close();
}
}
/**
*将存储快递对象的data写入文件EXPRESS_FILE_NAME
* @throws IOException
*/
public void expressWrite() throws IOException {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(expressFile));
oos.writeObject(this.data);
oos.close();
}
}
package eZhan_Map_IO_CS;
import java.io.*;
import java.net.Socket;
public class Client01 {
// 初始化视图对象
private static Views v = new Views();
public Client01() throws IOException {
}
public static void main(String[] args) {
try {
Socket socket = new Socket("127.0.0.1",8080);
OutputStream os = socket.getOutputStream();
InputStream is = socket.getInputStream();
ObjectOutputStream oos = new ObjectOutputStream(os);
ObjectInputStream ois = new ObjectInputStream(is);
//1. 欢迎
v.welcome();
m:while(true){
//2. 身份选择菜单
int m = v.menu();
switch (m){//退出
case 0:
break m;
case 1://管理员
User login = v.login();
oos.writeChar(‘1‘);
oos.writeObject(login);
oos.flush();
boolean b1 = (boolean) ois.readObject();
if (b1) {//登陆成功
v.loginSuccessfully();
cClient(oos,ois);
}else{//登录失败
v.loginFailure();
break ;
}
break m;
case 2://用户
//取件成功一次就退出程序 取件不成功则一直获取取件码
//1. 获取用户输入的账号密码
User login2 = v.login();
//2. 将‘1‘和账号密码传给服务器
oos.writeChar(‘2‘);//身份码
oos.writeObject(login2);//输入的账号密码
oos.flush();
//3. 接受服务器传来的信息 登录成功返回true
boolean b2 = (boolean) ois.readObject();
if(b2){//登陆成功
v.loginSuccessfully();
//用户菜单
uClient(oos,ois);
v.bey();
break m;
}else{//登录失败
v.loginFailure();
}
break ;
}
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("服务器维护中");
return;
}
v.bey();
}
private static void uClient(ObjectOutputStream oos,ObjectInputStream ois) throws IOException, ClassNotFoundException {
//1. 获取用户输入的取件码
int code = v.uMenu();
//2. 将取件码传到服务器
oos.writeObject(code);
oos.flush();
//3. 接收查找的结果
// 存在返回此快递对象 不存在返回null
Express e = (Express) ois.readObject();
if(e==null){//快递不存在
v.expressNull();
uClient(oos,ois);
}else{//取件成功
v.success();
v.printExpress(e);
}
}
private static int cClient(ObjectOutputStream oos,ObjectInputStream ois) throws Exception {
while (true) {
int mune = v.cMenu();//接收管理员
oos.writeObject(mune);
oos.flush();
switch (mune){
case 0:
return 0;
case 1:{//快递录入
//1. 提示输入快递信息
Express e = v.insert();
oos.writeObject(e);
oos.flush();
if((Boolean)ois.readObject()){
e = (Express) ois.readObject();
v.printExpress(e);
}else {
v.expressExist();
}
break;
}
case 2:{//快递修改
//1. 提示输入快递信息
String number = v.findBynumber();
oos.writeObject(number);
if(!(Boolean)ois.readObject()){
v.expressNull();
}else {
Express e = (Express) ois.readObject();
v.success();
v.printExpress(e);
Express newe = v.update();
oos.writeObject(newe);
oos.flush();
newe = (Express) ois.readObject();
if(newe!=null){
v.printExpress(newe);
}else{
v.expressExist();
}
}
}
break;
case 3:{//删除
//1. 输入快递单号
String number = v.findBynumber();
//2. 将单号传给服务器
oos.writeObject(number);
if(!(Boolean)ois.readObject()){
v.expressNull();
}else {
Express e = (Express) ois.readObject();
v.success();
v.printExpress(e);
oos.writeObject(v.delete());
oos.flush();
}
}
break;
case 4:{
Express[] data = (Express[])ois.readObject();
v.printAllList(data);
}
break;
}
}
}
}
package eZhan_Map_IO_CS;
import eZhan_Map_IO_CS.Views;
import eZhan_Map_IO_CS.Express;
import eZhan_Map_IO_CS.ExpressDao;
import java.io.*;
import java.net.Socket;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
public class Client02 {
// 初始化视图对象
private static Views v = new Views();
public Client02() throws IOException {
}
public static void main(String[] args) {
try {
Socket socket = new Socket("127.0.0.1",8080);
OutputStream os = socket.getOutputStream();
InputStream is = socket.getInputStream();
ObjectOutputStream oos = new ObjectOutputStream(os);
ObjectInputStream ois = new ObjectInputStream(is);
//1. 欢迎
v.welcome();
m:while(true){
//2. 身份选择菜单
int m = v.menu();
switch (m){//退出
case 0:
break m;
case 1://管理员
User login = v.login();
oos.writeChar(‘1‘);
oos.writeObject(login);
oos.flush();
boolean b1 = (boolean) ois.readObject();
if (b1) {//登陆成功
v.loginSuccessfully();
cClient(oos,ois);
}else{//登录失败
v.loginFailure();
break ;
}
break m;
case 2://用户
//取件成功一次就退出程序 取件不成功则一直获取取件码
//1. 获取用户输入的账号密码
User login2 = v.login();
//2. 将‘1‘和账号密码传给服务器
oos.writeChar(‘2‘);//身份码
oos.writeObject(login2);//输入的账号密码
oos.flush();
//3. 接受服务器传来的信息 登录成功返回true
boolean b2 = (boolean) ois.readObject();
if(b2){//登陆成功
v.loginSuccessfully();
//用户菜单
uClient(oos,ois);
v.bey();
break m;
}else{//登录失败
v.loginFailure();
}
break ;
}
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("服务器维护中");
return;
}
v.bey();
}
private static void uClient(ObjectOutputStream oos,ObjectInputStream ois) throws IOException, ClassNotFoundException {
//1. 获取用户输入的取件码
int code = v.uMenu();
//2. 将取件码传到服务器
oos.writeObject(code);
oos.flush();
//3. 接收查找的结果
// 存在返回此快递对象 不存在返回null
Express e = (Express) ois.readObject();
if(e==null){//快递不存在
v.expressNull();
uClient(oos,ois);
}else{//取件成功
v.success();
v.printExpress(e);
}
}
private static int cClient(ObjectOutputStream oos,ObjectInputStream ois) throws Exception {
while (true) {
int mune = v.cMenu();//接收管理员
oos.writeObject(mune);
oos.flush();
switch (mune){
case 0:
return 0;
case 1:{//快递录入
//1. 提示输入快递信息
Express e = v.insert();
oos.writeObject(e);
oos.flush();
if((Boolean)ois.readObject()){
e = (Express) ois.readObject();
v.printExpress(e);
}else {
v.expressExist();
}
break;
}
case 2:{//快递修改
//1. 提示输入快递信息
String number = v.findBynumber();
oos.writeObject(number);
if(!(Boolean)ois.readObject()){
v.expressNull();
}else {
Express e = (Express) ois.readObject();
v.success();
v.printExpress(e);
Express newe = v.update();
oos.writeObject(newe);
oos.flush();
newe = (Express) ois.readObject();
if(newe!=null){
v.printExpress(newe);
}else{
v.expressExist();
}
}
}
break;
case 3:{//删除
//1. 输入快递单号
String number = v.findBynumber();
//2. 将单号传给服务器
oos.writeObject(number);
if(!(Boolean)ois.readObject()){
v.expressNull();
}else {
Express e = (Express) ois.readObject();
v.success();
v.printExpress(e);
oos.writeObject(v.delete());
oos.flush();
}
}
break;
case 4:{
Express[] data = (Express[])ois.readObject();
v.printAllList(data);
}
break;
}
}
}
}
package eZhan_Map_IO_CS;
import java.io.Serializable;
import java.util.Objects;
/**
* 快递
*/
public class Express implements Serializable {
private String number;//单号
private String Company;//公司
private int code;//取件码
private int x,y;
public Express(String number, String Company, int code) {
this.number = number;
this.Company = Company;
this.code = code;
}
public Express() {
}
@Override
public String toString() {
return "Express{" +
"number=‘" + number + ‘\‘‘ +
", Company=‘" + Company + ‘\‘‘ +
", code=" + code +
‘}‘;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Express express = (Express) o;
return Objects.equals(number, express.number);
}
@Override
public int hashCode() {
return Objects.hash(number);
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = 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;
}
}
用户 User
package eZhan_Map_IO_CS;
import java.io.Serializable;
public class User implements Serializable {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
package eZhan_Map_IO_CS;
import eZhan_Map_IO_CS.Express;
import java.util.*;
public class Views {
private Scanner input = new Scanner(System.in);
public void welcome(){
System.out.println("------------欢迎使用哪都通快递管理系统------------");
System.out.println("------操作完后请正常退出,否则此次操作不做记录-------");
}
public User login(){
User user = new User();
System.out.println("请输入账号:");
user.setUsername(input.nextLine());
System.out.println("请输入密码:");
user.setPassword(input.nextLine());
return user;
}
public void bey(){
System.out.println("谢谢使用哪都通快递管理系统,欢迎下次再来^_^");
}
/**
* 、选择身份主菜单
* @return 身份码
*/
public int menu(){
System.out.println("请根据提示输入功能序号");
System.out.println("1:快递员");
System.out.println("2:用户");
System.out.println("0:退出");
String text = input.nextLine();
//这里的代码逻辑相较于 .nextInt优点在哪?
//单思考这个方法内的逻辑,没有什么优点.
//但是思考全局代码,是有优点:所有方法均使用nextLine,不会因为输入产生冲突,还可以更好的接收各种类型的数据.
int num=-1;
try {
num = Integer.parseInt(text);
}catch (NumberFormatException e){
}
if(num<0 || num>2){
System.out.println("输入错误,请重新输入!");
return menu();
}
return num;
}
/**
* 快递员菜单
* @return 操作码
*/
public int cMenu(){
System.out.println("请根据提示输入功能序号");
System.out.println("0:退出程序");
System.out.println("1:快递录入");
System.out.println("2:快递修改");
System.out.println("3:快递删除");
System.out.println("4:查看所有快递");
String text = input.nextLine();
int num=-1;
try {
num = Integer.parseInt(text);
}catch (NumberFormatException e){
}
if(num<0 || num>4){
System.out.println("输入错误,请重新输入!");
return cMenu();
}
return num;
}
/**
* 用户的菜单
* @return 取件码
*/
public int uMenu(){
System.out.println("请输入取件码:");
int num=-1;
String code = input.nextLine();
try {
num = Integer.parseInt(code);
}catch (NumberFormatException e){
}
if(num<100000 || num>999999){
System.out.println("输入错误,请重新输入!");
return uMenu();
}
return num;
}
/**
* 快递录入
* @return 包含了快递单号和公司的快递对象
*/
public Express insert(){
System.out.println("请根据提示输入快递信息");
System.out.println("请输入快递单号:");
String number = input.nextLine();
System.out.println("请输入公司:");
String company = input.nextLine();
Express e = new Express();
e.setNumber(number);
e.setCompany(company);
return e;
}
/**
* 提示用户输入快递单号
* @return 快递单号
*/
public String findBynumber(){
System.out.println("请输入要操作的快递单号");
String number = input.nextLine();
return number;
}
/**
* 显示快递信息
* @param e
*/
public void printExpress(Express e){
System.out.println("快递信息如下:");
System.out.println("快递公司:"+e.getCompany()+" 快递单号:"+e.getNumber()+" 取件码:"+e.getCode());
}
/**
*HashMap传输缺少刚添加的快递,所以弃用了
* 显示所有快递
* @param
*/
public void printAll(HashMap<String, Express> data){
if(data.size()==0){
System.out.println("暂无快递");
return;
}
Set<String> set = data.keySet();
for (String s: set) {
System.out.println("第"+data.get(s).getX()+"排"+",第"+data.get(s).getY()+"列快递:");
printExpress(data.get(s));
}
}
/**
* 显示所以快递
* @param data
*/
public void printAllList(Express[] data){
if(data.length!=0){
for (Express e : data) {
System.out.print("第"+e.getX()+"排"+",第"+e.getY()+"列快递:");
printExpress(e);
}
}else{
System.out.println("暂无快递");
}
}
/**
* 修改快递信息
* @param
*/
public Express update(){
Express express = new Express();
System.out.println("请输入新的快递单号:");
String number = input.nextLine();
express.setNumber(number);
System.out.println("请输入新的快递公司:");
String company = input.nextLine();
express.setCompany(company);
return express;
}
/**
* 询问是否确认删除
* @return
*/
public int delete(){
System.out.println("是否确认删除");
System.out.println("1.确认");
System.out.println("2.取消");
int num=-1;
String code = input.nextLine();
try {
num = Integer.parseInt(code);
}catch (NumberFormatException e){
}
if(num<1 || num>2){
System.out.println("输入错误,请重新输入!");
return delete();
}
return num;
}
/**
* 快递存在时打印
*/
public void expressExist(){
System.out.println("此单号在快递中已存在,请勿重复存储");
}
/**
* 快递不存在时打印
*/
public void expressNull(){
System.out.println("此快递不存在,请检查输入是否有误");
}
/**
* 打印取件码
*/
// public void printCode(Express e){
// System.out.println("快递的取件码为:"+e.getCode());
// }
public void completion(){
System.out.println("快递柜已满!");
}
public void success(){
System.out.println("操作成功");
}
public void loginFailure(){
System.out.println("登录失败");
System.out.println("账号或密码错误");
}
public void loginSuccessfully(){
System.out.println("登录成功!");
}
}
Client客户端 :接受用户的输入传给服务器,接受服务器的输入,并创建视图层,把根据传回来的内容把需要输出的信息输出到控制台。
Server服务器 :创建Dao对象,接受用户的输入,根据输入的值对Dao对象进行操作,并将操作的结果返回客户端,每个用户线程结束,将Dao的存储快递对象、管理员用户、普通用户的HashMap存储到文件夹,下一个线程创建时会读取修改后的内容
Dao :创建时会读取文件的内容
Views:视图层,提示用户
原来就有一个快递单号为ad,查看所有后存储快递的data的长度是1,快递as是不存在的,后面我在客户端加了单号为as的快递,服务器输出data的长度是2,快递as也找到了,但是传过去的data却没有单号为as这个快递,看了一下,HashMap、我的Express也是继承了 Serializable这个接口的
有大神懂吗
Part1快递驿站进阶-多线程+网络编程
原文:https://www.cnblogs.com/RRRRRR/p/15121441.html