首页 > 编程语言 > 详细

快递驿站进阶-多线程+网络编程

时间:2021-08-10 11:01:28      阅读:34      评论:0      收藏:0      [点我收藏+]

Part1快递驿站进阶-多线程+网络编程

1服务器 Server

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;
        }
    }
}

2数据存取 Dao

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();
    }
}

3客户端 Client01

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;
            }
        }
    }
}

4客户端 Client02

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;
            }
        }
    }
}

5快递对象 Express

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;
    }
}

6视图层 Views

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!