快乐E栈项目实战第五阶段

2023-11-04

快乐E栈项目实战第五阶段


1、前言

学习完网络编程了,我们可以试着开发一个服务端程序,将快递信息发送到服务端进行文件存储,实际项目中也基本上都会将重要信息保存到服务端的,将数据存储在客户端并不安全。

此外,服务端支持多线程技术,我们尝试测试多客户端发送服务端进行快递存储,也就是多快递柜信息存储到服务端。

2、功能分析

由于需要多个客户端,所以我们还需要对不同客户端进行身份区分,暂时使用简单id的方式进行区分,一般设备可以发送mac地址作为唯一id,我们这里简化,客户端发送任意字符串即可,服务端也暂时不做校验。

分析下来客户端增加了如下功能:

  • 1、客户端唯一码获取,一般取设备唯一mac地址;
  • 2、身份远端验证;
  • 3、与服务端通信;

服务端功能:

  • 1、多客户端连接;
  • 2、客户端身份确认;
  • 3、以客户端身份mac为文件名创建文件;
  • 4、多客户端快递信息存储;
  • 5、文件操作;
  • 6、与多客户端通信;

3、简单协议设计

为了实现客户端和服务端的业务交互,我们需要设计简单的业务协议用来传输指令和数据,由于我们还没有总结json、xml等格式,所以暂时还是使用纯字符串的方式来囊括指令和数据。

我们的指令和快递数据通过";"分隔,第一个内容为指令,后续的为相关通信数据,为了减少程序的复杂性,暂时设计并实现以下指令:connectCheck、saveExpress、queryExpress、disconnect。

  • connectCheck:用于客户端和服务端的连接判断以及获取该客户端的快递信息存储文件名,没有该文件则创建(实际项目中可能还有注册等过程,暂时都省略,等后续总结了数据库、前端等内容后再来完善,目前的重心是实践网络编程)
  • saveExpress:用于存储快递信息,各个快递的信息也通过分号分隔转换为字符串后交互,增加、删除、修改后将全部内容进行传递存储;(不做单独的处理,文件操作单独处理较麻烦,等后续总结完数据库后使用数据库来进行这些操作更方便,这里可以用来数据字符串操作)
  • queryExpress:查询快递信息,在客户端启动开始后建立连接完成就可以从数据库查询所有数据,然后存储到本地内存中,界面的查询实际上只是从内存中查询,不用频繁查询服务端文件(实际项目中不是特别重要的数据一般也会这样缓存到客户端,但是为了防止内存修改可能有的数据也不会缓存)
  • disconnect:客户端断开连接

协议示例:

connectCheck;deviceMac=123456789

saveExpress;96=number\:123,company\:顺丰,code\:677491;70=number\:124,company\:圆通,code\:638754;20=number\:125,company\:中通,code\:990138

queryExpress;

disconnect;

4、代码

(1).服务端

Main:

package com.xiaoyaoyou.expressserver.main;

import com.xiaoyaoyou.expressclient.bean.Express;
import com.xiaoyaoyou.expressserver.dao.ExpressDao;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Objects;

public class Main {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(5555);
        System.out.println("服务端创建成功");

        while (true) {
            Socket socket = serverSocket.accept();

            new Thread(new Runnable() {
                @Override
                public void run() {
                    SocketServer socketServer = new SocketServer();
                    ExpressDao expressDao = null;
                    while (true) {
                        String res = socketServer.read(socket);
                        if(res == null) {
                            continue;
                        }
                        System.out.println(res);
                        String[] ss = res.split(";");
                        if (Objects.equals(ss[0], "connectCheck")) {
                            System.out.println("connectCheck");
                            String mac = ss[1].split("=")[1];
                            System.out.println(mac);
                            expressDao = new ExpressDao(mac);
                            socketServer.write(socket, "success");
                        } else if (Objects.equals(ss[0], "saveExpress")) {
                            expressDao.saveExpress(ss);
                            socketServer.write(socket, "success");
                        } else if (Objects.equals(ss[0], "queryExpress")) {
                            String data = expressDao.queryAllExpress();
                            if(data == null) {
                                socketServer.write(socket, "failed");
                            } else {
                                socketServer.write(socket, data);
                            }
                        } else if(Objects.equals(ss[0], "disconnect")) {
                            System.out.println("客户端断开连接");
                            break;
                        }
                    }
                }
            }).start();
        }
   }
}

对收发做了简单封装:

package com.xiaoyaoyou.expressserver.main;

import com.xiaoyaoyou.expressserver.dao.ExpressDao;

import java.io.*;
import java.net.Socket;

public class SocketServer {
    public String read(Socket socket) {
        InputStream inputStream;
        try {
            inputStream = socket.getInputStream();
        } catch (IOException e) {
            System.out.println("Get inputstream from client failed.");
            return null;
        }

        //做客户端身份验证,暂时只做文件名匹配,(等学完json和xml后续通信使用json等格式传递),目前示例:connectCheck;deviceMac:xxx
        BufferedReader bufferedReader;
        bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String text;
        try {
            text = bufferedReader.readLine();
            return text;
        } catch (IOException e) {
            System.out.println("read from client inputstream faild.");
            //应该是设置超时阻塞读取,读取多少次还不成功就关闭该连接
        }
        return null;
    }

    public void write(Socket socket, String message) {
        OutputStream outputStream;
        try {
            outputStream = socket.getOutputStream();
        } catch (IOException e) {
            System.out.println("get output stream failed.");
            return;
        }
        PrintStream printStream = new PrintStream(outputStream);
        printStream.println(message);
        System.out.println("服务端发送:"+message);
    }
}

dao(目前就是查询文件和写入文件,为了方便写入每次删除文件然后再写入,快递信息固化为100个,不然文件遍历写和查询会很麻烦,我们这里的重点是网络编程):

package com.xiaoyaoyou.expressserver.dao;

import com.xiaoyaoyou.expressclient.bean.Express;

import java.io.*;
import java.util.ArrayList;
import java.util.Objects;
import java.util.Properties;
import java.util.Random;

public class ExpressDao {
    private String pathName;

    public ExpressDao(String pathName) {
        this.pathName = pathName;
        File file = new File(pathName);
        if(!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException ioException) {
                ioException.printStackTrace();
            }
        }
    }

    public void saveExpress(String[] ss) {
        File file = new File(pathName);
        if(file.exists()) {
            file.delete();
        }
        try {
            file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }

        FileOutputStream fileOutputStream = null;
        try {
            fileOutputStream = new FileOutputStream(pathName, true);
        } catch (IOException e) {
            e.printStackTrace();
        }
        PrintStream printStream = new PrintStream(fileOutputStream);
        for(int i = 1; i < 101; i++) {
            printStream.println(ss[i]);
        }
        try {
            fileOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public String queryAllExpress() {
        String res = "";
        FileReader fileReader = null;
        try {
            fileReader = new FileReader(pathName);
        } catch (FileNotFoundException e) {
            System.out.println("file reader failed.");
            return null;
        }
        BufferedReader bufferedReader = new BufferedReader(fileReader);
        try {
            String line = null;
            while ((line = bufferedReader.readLine()) != null) {
                res += line;
                res += ";";
            }
        } catch (IOException e) {
            System.out.println("file reader failed.");
            return null;
        }

        if(res != "") {
            return res;
        }

        System.out.println("res is null.");
        return null;
    }
}

(2).客户端

Main(对socket的操作做了简单封装):

package com.xiaoyaoyou.expressclient.main;

import com.xiaoyaoyou.expressclient.dao.ExpressDao;
import com.xiaoyaoyou.expressclient.view.Views;

import java.io.IOException;

public class Main {
    //初始化视图对象
    private static Views v = new Views();
    //初始化dao对象
    private static ExpressDao dao = new ExpressDao();

    private static CourierClient cClient;
    private static UserClient uClient;

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

        while (run()) {
        }

        destroy();
    }

    /**
     * 初始化
     */
    private static void init() {
        //1.欢迎
        v.welcome();

        cClient = new CourierClient(dao, v);
        uClient = new UserClient(dao, v);

        dao.queryAll();
    }

    /**
     * 主进程运行流程
     * @return
     */
    private static boolean run() {
        //2.弹出身份选择菜单
        int menu = v.menu();
        switch (menu) {
            case 0:
                //退出
                return false;
            case 1:
                //快递员
                cClient.select();
                break ;
            case 2:
                //用户
                uClient.getExpress();
                break ;
        }

        return true;
    }

    /**
     * 资源释放
     */
    private static void destroy() {
        dao.socketClient.disconnect();
        //释放资源
        v.bye();
    }
}
package com.xiaoyaoyou.expressclient.main;

import java.io.*;
import java.net.Socket;

public class SocketClient {
    private Socket socket;

    public SocketClient(String host, int port) {
        try {
            socket = new Socket(host, port);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public boolean connectCheck(String mac) {
        if(socket == null) {
            return false;
        }
        this.write("connectCheck;deviceMac="+mac);
        System.out.println("connectCheck");
        String res = this.read();
        if(res == "success") {
            return true;
        }

        return false;
    }

    public String read() {
        if(socket == null) {
            System.out.println("socket is null.");
            return null;
        }
        InputStream inputStream = null;
        try {
            inputStream = socket.getInputStream();
        } catch (IOException e) {
            System.out.println("get input stream is null.");
            return null;
        }
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String text = "";
        String line = null;
        try {
            text = bufferedReader.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("客户端收到消息:" + text);
        return text;
    }

    public void write(String message) {
        if(socket == null) {
            System.out.println("socket is null");
            return;
        }
        OutputStream outputStream = null;
        try {
            outputStream = socket.getOutputStream();
            PrintStream printStream = new PrintStream(outputStream);
            printStream.println(message);
        } catch (IOException e) {
            System.out.println("socket get outputstream is null.");
        }
    }

    public void disconnect() {
        this.write("disconnect");
    }
}
package com.xiaoyaoyou.expressclient.main;

import com.xiaoyaoyou.expressclient.bean.Express;
import com.xiaoyaoyou.expressclient.dao.ExpressDao;
import com.xiaoyaoyou.expressclient.view.Views;

public class UserClient {
    private ExpressDao dao;
    private Views v;

    public UserClient() {
    }

    public UserClient(ExpressDao dao, Views v) {
        this.dao = dao;
        this.v = v;
    }

    public ExpressDao getDao() {
        return dao;
    }

    public void setDao(ExpressDao dao) {
        this.dao = dao;
    }

    public Views getV() {
        return v;
    }

    public void setV(Views v) {
        this.v = v;
    }

    public void getExpress() {
        //1、获取取件码
        int code = v.uMenu();
        //2、根据取件码取出快递
        Express e = dao.findByCode(code);
        if (e == null) {
            v.printNull();
        } else {
            v.success();
            v.printExpress(e);
            dao.delete(e);
        }
    }
}

bean:

package com.xiaoyaoyou.expressclient.bean;

import java.util.Objects;

public class Express {
    //单号
    private String number;
    //快递公司
    private String company;
    //取件码
    private int code;

    public Express(String number, String company, int code) {
        this.number = number;
        this.company = company;
        this.code = code;
    }

    @Override
    public String toString() {
        return "number:" + number +
                ",company:" + company +
                ",code:" + code;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass() || number == null || number.equals("null")) return false;
        Express express = (Express) o;
        return number.equals(express.number);
    }

    @Override
    public int hashCode() {
        return Objects.hash(number);
    }

    public Express() {
    }

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

dao(原本的文件存储全部去掉了放到服务端了,目前查询只在客户端开始时查询一次放到内存中,然后修改、删除、添加都将所有内容全部发送服务端进行覆盖存储,等到有了数据库再细化接口即可):

package com.xiaoyaoyou.expressclient.dao;

import com.xiaoyaoyou.expressclient.bean.Express;
import com.xiaoyaoyou.expressclient.main.SocketClient;

import java.util.ArrayList;
import java.util.Objects;
import java.util.Random;

public class ExpressDao {
    private ArrayList<Express> data = null;
    public SocketClient socketClient;
    //当前存储的快递数(空间换时间)
    private int size;
    {
        data = new ArrayList<Express>();
        for(int i = 1; i <= 100; i++) {
            data.add(new Express("null", "null", 0));
        }
    }

    public ExpressDao() {
        socketClient = new SocketClient("127.0.0.1", 5555);
        socketClient.connectCheck("123456");
    }

    public boolean queryAll() {
        socketClient.write("queryExpress;");
        System.out.println("queryExpress");
        String res = socketClient.read();
        if(res == null) {
            return false;
        }

        if(res.equals("failed")) {
            return false;
        }

        String[] ss = res.split(";");
        for(int i = 0; i < ss.length; i++) {
            parseExpress(ss[i], data.get(i));
        }

        return true;
    }

    public void parseExpress(String str, Express express) {
            String[] ss2 = str.split(",");
            for(int j = 0; j < ss2.length; j++) {
                String[] ss3 = ss2[j].split(":");
                if(j == 0) {
                    express.setNumber(ss3[1]);
                } else if(j == 1) {
                    express.setCompany(ss3[1]);
                } else if(j == 2) {
                    express.setCode(Integer.parseInt(ss3[1]));
                }
            }
    }

    private Random random = new Random();

    /**
     * 用于存储快递
     * @param e
     * @return
     */
    public boolean add(Express e) {
        if(size == 100) {
            return false;
        }
        //1. 随机生成ArrayList的下标
        int index = -1;

        while (true) {
            index = random.nextInt(100);
            if (Objects.equals(data.get(index).getNumber(), "null")) {
                //此位置无快递
                break;
            }
        }
        //2. 取件码
        int code = randomCode();
        e.setCode(code);
        data.get(index).setCode(code);
        data.get(index).setNumber(e.getNumber());
        data.get(index).setCompany(e.getCompany());
        size++;

        saveExpressInfo();

        return true;
    }

    /**
     * 生成取件码(模板方法设计模式)
     * @return
     */
    private int randomCode() {
        while (true){
            int code = random.nextInt(900000)+100000;
            Express e = findByCode(code);
            if(e == null) {
                return code;
            }
        }
    }

    /**
     * 根据快递单号查询快递
     * @param number
     * @return 查询的结果,查询失败时返回null
     */
    public Express findByNumber(String number) {
        Express e = new Express();
        e.setNumber(number);
        for (Express v: data) {
            if(e.equals(v)) {
                return v;
            }
        }

        return null;
    }

    /**
     * 根据取件码查询快递
     * @param code 要查询的取件码
     * @return 查询的结果,查询失败时返回null
     */
    public Express findByCode(int code) {
        for (Express e: data) {
            if (e != null) {
                if (e.getCode() == code) {
                    return e;
                }
            }
        }
        return null;
    }


    /**
     * 多余的操作,为了mvc更圆润
     * @param oldExpress
     * @param newExpress
     */
    public void update(Express oldExpress, Express newExpress) {
        saveExpressInfo();
    }

    /**
     * 删除快递
     * @param e
     */
    public void delete(Express e) {
        if (data.isEmpty()) {
            return;
        }
        for (Express v: data) {
            if(e.getNumber() == v.getNumber()) {
                e.setCode(0);
                e.setCompany(null);
                e.setNumber(null);
                size--;
                break;
            }
        }

        saveExpressInfo();
        return ;
    }

    public ArrayList<Express> findAll() {
        return data;
    }

    /**
     * 存储快递信息
     */
    private void saveExpressInfo() {
        System.out.println("save express info");
        StringBuilder message = new StringBuilder("saveExpress;");
        for (Express e: data) {
           message.append(e.toString());
           message.append(";");
        }
        System.out.println(message.toString());
        socketClient.write(message.toString());
    }
}

5.结果

服务端

服务端创建成功
connectCheck;deviceMac=123456
connectCheck
123456
服务端发送:success
queryExpress;
服务端发送:number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:124,company:hehe,code:605055;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;
saveExpress;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:124,company:hehe,code:605055;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:123,company:haha,code:127376;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;
服务端发送:success
saveExpress;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:124,company:hehe,code:605055;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:125,company:hhihi,code:127376;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;
服务端发送:success
saveExpress;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:124,company:hehe,code:605055;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;
服务端发送:success
saveExpress;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:124,company:hehe,code:605055;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:123,company:haha,code:504032;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;
服务端发送:success
saveExpress;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:123,company:haha,code:504032;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;
服务端发送:success
disconnect
客户端断开连接

客户端

connectCheck
客户端收到消息:success
欢迎使用快乐E栈快递管理系统
queryExpress
客户端收到消息:number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:124,company:hehe,code:605055;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;
请根据提示,输入功能序号:
1. 快递员
2. 普通用户
0. 退出
1
请根据提示,输入功能序号:
1. 快递录入
2. 快递修改
3. 快递删除
4. 查看所有快递
0. 返回上级目录
4
快递公司:hehe,快递单号:124,取件码:605055
请根据提示,输入功能序号:
1. 快递录入
2. 快递修改
3. 快递删除
4. 查看所有快递
0. 返回上级目录
1
请根据提示,输入快递信息:
请输入快递单号:
123
请输入快递公司:
haha
save express info
saveExpress;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:124,company:hehe,code:605055;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:123,company:haha,code:127376;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;
快递公司:haha,快递单号:123,取件码:127376
请根据提示,输入功能序号:
1. 快递录入
2. 快递修改
3. 快递删除
4. 查看所有快递
0. 返回上级目录
4
快递公司:hehe,快递单号:124,取件码:605055
快递公司:haha,快递单号:123,取件码:127376
请根据提示,输入功能序号:
1. 快递录入
2. 快递修改
3. 快递删除
4. 查看所有快递
0. 返回上级目录
2
请根据提示,输入快递信息:
请输入要操作的快递单号:
123
快递公司:haha,快递单号:123,取件码:127376
请根据提示,输入新的快递单号:
125
请根据提示,输入新的快递公司:
hhihi
save express info
saveExpress;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:124,company:hehe,code:605055;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:125,company:hhihi,code:127376;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;
快递公司:hhihi,快递单号:125,取件码:127376
请根据提示,输入功能序号:
1. 快递录入
2. 快递修改
3. 快递删除
4. 查看所有快递
0. 返回上级目录
4
快递公司:hehe,快递单号:124,取件码:605055
快递公司:hhihi,快递单号:125,取件码:127376
请根据提示,输入功能序号:
1. 快递录入
2. 快递修改
3. 快递删除
4. 查看所有快递
0. 返回上级目录
3
请根据提示,输入快递信息:
请输入要操作的快递单号:
125
快递公司:hhihi,快递单号:125,取件码:127376
是否确认删除?
1. 确认删除
2. 取消操作
0. 退出
1
save express info
saveExpress;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:124,company:hehe,code:605055;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;
操作成功
请根据提示,输入功能序号:
1. 快递录入
2. 快递修改
3. 快递删除
4. 查看所有快递
0. 返回上级目录
1
请根据提示,输入快递信息:
请输入快递单号:
123
请输入快递公司:
haha
save express info
saveExpress;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:124,company:hehe,code:605055;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:123,company:haha,code:504032;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;
快递公司:haha,快递单号:123,取件码:504032
请根据提示,输入功能序号:
1. 快递录入
2. 快递修改
3. 快递删除
4. 查看所有快递
0. 返回上级目录
4
快递公司:hehe,快递单号:124,取件码:605055
快递公司:haha,快递单号:123,取件码:504032
请根据提示,输入功能序号:
1. 快递录入
2. 快递修改
3. 快递删除
4. 查看所有快递
0. 返回上级目录
0
请根据提示,输入功能序号:
1. 快递员
2. 普通用户
0. 退出
2
请根据提示,输入六位取件码:
请输入您的取件码
605055
操作成功
快递公司:hehe,快递单号:124,取件码:605055
save express info
saveExpress;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:123,company:haha,code:504032;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;number:null,company:null,code:0;
请根据提示,输入功能序号:
1. 快递员
2. 普通用户
0. 退出
0
欢迎下次使用~

截图:

在这里插入图片描述

生成的文件123456:

number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:123,company:haha,code:504032
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
number:null,company:null,code:0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

快乐E栈项目实战第五阶段 的相关文章

  • Hibernate注解放置问题

    我有一个我认为很简单的问题 我见过两种方式的例子 问题是 为什么我不能将注释放在字段上 让我举一个例子 Entity Table name widget public class Widget private Integer id Id G
  • Java:如何从转义的 URL 获取文件?

    我收到了一个定位本地文件的 URL 事实上我收到的 URL 不在我的控制范围内 URL 按照 RFC2396 中的定义进行有效转义 如何将其转换为 Java File 对象 有趣的是 URL getFile 方法返回一个字符串 而不是文件
  • 运行具有外部依赖项的 Scala 脚本

    我在 Users joe scala lib 下有以下 jar commons codec 1 4 jar httpclient 4 1 1 jar httpcore 4 1 jar commons logging 1 1 1 jar ht
  • 如何在不超过最大值的情况下增加变量?

    我正在为学校开发一个简单的视频游戏程序 我创建了一个方法 如果调用该方法 玩家将获得 15 点生命值 我必须将生命值保持在最大值 100 并且由于我目前的编程能力有限 我正在做这样的事情 public void getHealed if h
  • 如何安全地解决这个 Java 上下文类加载器问题?

    我的数百名用户中只有一位在启动我的 Java 桌面应用程序时遇到问题 他只有大约三分之一的时间开始 另外三分之二的时间在启动时抛出 NullPointerException Exception in thread AWT EventQueu
  • 在 S3 中迭代对象时出现“ConnectionPoolTimeoutException”

    我已经使用 aws java API 一段时间了 没有遇到太多问题 目前我使用的是库 1 5 2 版本 当我使用以下代码迭代文件夹内的对象时 AmazonS3 s3 new AmazonS3Client new PropertiesCred
  • Hazelcast 分布式锁与 iMap

    我们目前使用 Hazelcast 3 1 5 我有一个简单的分布式锁定机制 应该可以跨多个 JVM 节点提供线程安全性 代码非常简单 private static HazelcastInstance hInst getHazelcastIn
  • hibernate锁等待超时超时;

    我正在使用 Hibernate 尝试模拟对数据库中同一行的 2 个并发更新 编辑 我将 em1 getTransaction commit 移至 em1 flush 之后我没有收到任何 StaleObjectException 两个事务已成
  • 普罗米修斯指标 - 未找到

    我有 Spring Boot 应用程序 并且正在使用 vertx 我想监控服务和 jvm 为此我选择了 Prometheus 这是我的监控配置类 Configuration public class MonitoringConfig Bea
  • 以编程方式在java的resources/source文件夹中创建文件?

    我有两个资源文件夹 src 这是我的 java 文件 资源 这是我的资源文件 图像 properties 组织在文件夹 包 中 有没有办法以编程方式在该资源文件夹中添加另一个 properties 文件 我尝试过这样的事情 public s
  • Javafx过滤表视图

    我正在尝试使用文本字段来过滤表视图 我想要一个文本字段 txtSearch 来搜索 nhs 号码 名字 姓氏 和 分类类别 我尝试过在线实施各种解决方案 但没有运气 我对这一切仍然很陌生 所以如果问得不好 我深表歉意 任何帮助将不胜感激 我
  • 有没有一种快速方法可以从 Jar/war 中删除文件,而无需提取 jar 并重新创建它?

    所以我需要从 jar war 文件中删除一个文件 我希望有类似 jar d myjar jar file I donot need txt 的内容 但现在我能看到从 Linux 命令行执行此操作的唯一方法 不使用 WinRAR Winzip
  • 如何知道抛出了哪个异常

    我正在对我们的代码库进行审查 有很多这样的陈述 try doSomething catch Exception e 但我想要一种方法来知道 doSomething 抛出了哪个异常 在 doSomething 的实现中没有 throw 语句
  • 在 Spring 中重构这个的最佳方法?

    private final ExecutorService executorParsers Executors newFixedThreadPool 10 public void parse List
  • 游戏内的java.awt.Robot?

    我正在尝试使用下面的代码来模拟击键 当我打开记事本时 它工作正常 但当我打开我想使用它的游戏时 它没有执行任何操作 所以按键似乎不起作用 我尝试模拟鼠标移动和点击 这些动作确实有效 有谁知道如何解决这个问题 我发现这个问题 如何在游戏中使用
  • 替换后增量

    我自己已经有一个问题了 但我想扩展它后增量示例 https stackoverflow com questions 51308967 post increment with example char a D int b 5 System o
  • 具有特定参数的 Spring AOP 切入点

    我需要创建一个我觉得很难描述的方面 所以让我指出一下想法 com x y 包 或任何子包 中的任何方法 一个方法参数是接口 javax portlet PortletRequest 的实现 该方法中可能有更多参数 它们可以是任何顺序 我需要
  • Trie 数据结构 - Java [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 是否有任何库或文档 链接提供了在 java 中实现 Trie 数据结构的更多信息 任何帮助都会很棒 Thanks 你可以阅读Java特里树
  • 在 RESTful Web 服务中实现注销

    我正在开发一个需要注销服务的移动应用程序 登录服务是通过数据库验证来完成的 现在我陷入了注销状态 退一步 您没有提供有关如何在应用程序中执行身份验证的详细信息 并且很难猜测您在做什么 但是 需要注意的是 在 REST 应用程序中 不能有会话
  • 如何在 JFreeChart 中设置多个系列的线条粗细?

    我创建了很多图表 在他们每个人中我都需要打电话 renderer setSeriesStroke i new BasicStroke 2 0f 对于每个系列 renderer is chart getXYPlot getRenderer 我

随机推荐

  • dnf服务器维护公告,11月18日早4点-12点服务器例行维护公告

    尊敬的DNF用户 为保证服务器的稳定运行 提高游戏品质 我们将于2008年11月18日 周二 凌晨04 00 12 00对所有服务器停机 进行例行维护工作 根据维护工作的进度 停机结束时间有可能提前或者延后 由于福建1区 广东2区 广东3区
  • Apache Beam -- 简介

    概述 在大数据的浪潮之下 技术的更新迭代十分频繁 受技术开源的影响 大数据开发者提供了十分丰富的工具 但也因为如此 增加了开发者选择合适工具的难度 在大数据处理一些问题的时候 往往使用的技术是多样化的 这完全取决于业务需求 比如进行批处理的
  • IT专业技术人员学习网站整理

    1 高端数据资料库 http www chiefdatum com 站点介绍 包含产品数据 学习资料 技术资料 热门图书 眼镜设计 考研 医疗器械等资料为一体的综合性网站 提供专业性下载 2 CSDN NET http www csdn n
  • SpringMVC入门案例

    SpringMVC 概述 SpringMVC是一种基于Java实现MVC模型的轻量级Web框架 三层架构 表现层 负责数据展示 业务层 负责业务处理 数据层 负责数据操作 MVC Model View Controller 一种用于设计创建
  • Java本地缓存CaffeineCache集成

    首先导入需要的依赖
  • 递归展示用户端商品分类列表的层级关系

    递归展示用户端商品分类列表的层级关系 自定义列表实体类 service层 递归调用 自定义列表实体类 添加属性 private List
  • Khan公开课 - 统计学学习笔记:(三)随机变量、概率密度、二项分布、期望值

    随机变量 Random Variable 随机变量和一般数据上的变量不一样 通常用大写字母表示 如X Y Z 不是个参数而是function 即函数 例如 下面表示明天是否下雨的随机变量X 如下 又例如X 每小时经过路口的车辆 随机变量是个
  • MicroPython串口数据转换技巧

    技巧一 还原从串口接收的HEX字符串 首先上官方文档 确认接收数据类型为bytes 串口读来的bytes类型HEX数据转换成HEX类型字符串转换函数 ByteToHex的转换 返回数据16进制字符串 def ByteToHex bins r
  • 使用Nacos实现分布式配置管理和服务发现

    文章目录 一 前言 二 Nacos 1 1什么是Nacos 1 1 1 服务发现和注册 1 1 1 1 服务注册 1 1 1 2 服务发现 1 2 Nacos的使用 1 2 1 配置管理 1 2 2 服务发现 三 结论 一 前言 在现代分布
  • 相关滤波的视觉目标跟踪算法学习

    相关滤波的视觉目标跟踪算法学习内容 1 视觉目标跟踪的难点 训练数据有限 通用目标跟踪任务中 目标先验知识缺乏 仅有目标初始位置信息 目标不确定性 跟踪过程中 随着目标尺寸 形状以及姿态等变化 其外观模 型存在明显差异 多目标跟踪任务中 当
  • 1.2 DICOM成像协议剖析

    以下链接是本系列文章 不足之处 可在评论区讨论 系列文章 1 1 DICOM协议简介及应用 1 2 DICOM成像协议剖析 1 3 DICOM成像协议实现思路 1 4 DICOM图像CT值计算 1 5 DICOM图像CT值转RGB 1 6
  • linux+性能排查,Linux系统性能排查基础

    此文已由作者李晶授权网易云社区发布 欢迎访问 上一期运维季刊中 我们重点从CPU方面分析了Linux系统性能瓶颈 除了CPU之外 内存 IO和网络也是常见的造成系统出现问题的根源 本篇我们继续介绍如何从这三个子系统来排查Linux整个系统的
  • Redis配置数据持久化---APPEND ONLY MODE

    Redis可以实现数据的持久化存储 即将数据保存到磁盘上 Redis的持久化存储提供两种方式 RDB与AOF RDB是默认配置 AOF需要手动开启 现在Redis的配置中默认是关闭AOF模式的 如果要开启AOF模式 修改Redis的配置文件
  • [5机器学习]计算机视觉的世界-卷积神经网络(CNNs)

    我们知道 数据不仅包含文字 数字 还包含图片 视频等 如何更好地查看 识别和解释图像和视频的内容 就像人类视觉一样 一直是目前人工智能的主要研究方向 机器学习无疑是现代数据科学的核心 在经历了几十年回归 分类 决策树 异常检测的沉淀后 数据
  • 期货投资者教育系列丛书 铝

    铝是一种轻金属 其化合物在自然界中分布极广 地壳中铝的资源约为400 500 亿吨 仅次于氧和硅 具第三位 在金属品种中 仅次于钢铁 为第二大类金属 铝具有特殊的化学 物理特性 不仅重量轻 质地坚 而且具有良好的延展性 导电性 导热性 耐热
  • 2022春招前端最新面试题分享(航天宏图)

    航天宏图面经 公司及岗位信息 公司 航天宏图 岗位 前端校招 地点 北京 薪资 10k 15k 面试结果 二面必须让线下面试 去不了 一面 2022 04 21 自我介绍 为什么没有在实习公司转正 实习对于你最大的收获 WebSocket在
  • qt connect 无效_QT 信号槽connect写法

    先看下示例 QPushButton btn new QPushButton 方式一 老式写法 connect btn SIGNAL clicked this SLOT close 方式二 Qt5后新写法 connect btn QPushB
  • Vue父组件子组件的通信方式20种(全网最全总结)

    目录 一 常用 Props 父组件 子组件 emit和 on 父组件 子组件 parent和 children 父组件 子组件 attrs和 listeners 父组件 子组件 provide和inject 父组件 子组件 二 其他探索 E
  • Ubuntu安装Visual Studio Code

    一 Visual Studio Code介绍 Visual Studio Code 简称VS Code 是一款由微软开发的跨平台代码编辑器 它支持多种编程语言 包括C C Java JavaScript Python等等 VS Code具有
  • 快乐E栈项目实战第五阶段

    快乐E栈项目实战第五阶段 文章目录 快乐E栈项目实战第五阶段 1 前言 2 功能分析 3 简单协议设计 4 代码 1 服务端 2 客户端 5 结果 服务端 客户端 1 前言 学习完网络编程了 我们可以试着开发一个服务端程序 将快递信息发送到