天天看点

发送socket 数据包

说白了就是发送个字符串给一个地址

这个字符串有一定的要求,然后返回一个字符串,里面有你所需要的数据

按两方协商好的规则解密啥的就完了

第一步 按规则生成字符串,

try{
            //生成 socket 数据包
            String SchoolFlag = entiy.getSchoolFlag();
//            String SchoolFlag = ReadProperties.getUrlValue("SchoolFlag");

            String sendStrs = "";//发送的数据包

            SimpleDateFormat NowDates1 = new SimpleDateFormat("yyyyMMddHHmmss");
            Date date = new Date();
            String DateStr = NowDates1.format(date);//请求时间

            String check = ReadProperties.getUrlValue("check");
            String verify = ReadProperties.getUrlValue("TS_FEES_SEARCH");//功能号

            sendStrs += Processing.getStrVlaue(SchoolFlag,18);//学校ID
            sendStrs += Processing.getStrVlaue(entiy.getStudentId(),18);//学生账号/学号/手机号
            sendStrs += Processing.getStrVlaue(entiy.getStudentName(),18);//学生姓名
            sendStrs += Processing.getStrVlaue("",16);//密码
            sendStrs += Processing.getStrVlaue(entiy.getFsSerialno(),32);//缴费编号
            sendStrs += Processing.getStrVlaue(DateStr,14);//请求时间

            //需要加签的str
            String SignStr = Processing.getStrVlaue(SchoolFlag,18)
                    + Processing.getStrVlaue(entiy.getStudentId(),18)
                    +Processing.getStrVlaue("",16)
                    + Processing.getStrVlaue(entiy.getFsSerialno(),32)
                    + Processing.getStrVlaue(DateStr,14);

            String Sign = Processing.md5(SignStr + check);
            int SendLens = Processing.getStrLen(sendStrs) + 42;//包长度


            Object sss = request.getServletContext().getAttribute("queryStuSerial");
            int intS = Integer.parseInt(String.valueOf(sss))+1;
            String serial = Processing.getIntVlaue(intS, 4);
            serial = serial.substring(serial.length()-4);
            request.getServletContext().setAttribute("queryStuSerial",serial);

            String packages = Processing.getIntVlaue(SendLens,4) + verify + serial;// 包头
            sendStrs = packages + sendStrs + Sign;
//             System.out.println("SendStr:"+sendStrs);
            log2.info("SendStr:"+sendStrs);
            //发送socket并接收数据
            String replyInfo = SendSocketUtis.SendMessage(sendStrs);
           

第二步

发送socket

/**
     * 发送socket数据
     * */
    public static String SendMessage(String SendValue){
        String ReceiveData = "";
        byte[] res = null;
        Socket socket = null;
        InputStream is = null;
        OutputStream os = null;
        log2.info("IP_ADDR:"+IP_ADDR);
        log2.info("PORT:"+PORT);
        try {
            //发送数据
            socket = new Socket(IP_ADDR, PORT);
            os = socket.getOutputStream();
            os.write(SendValue.getBytes("GBK"));
            os.flush();

            //接收数据
            is = socket.getInputStream();
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int count = 0;
            do {
                count = is.read(buffer);
                bos.write(buffer, 0, count);
            } while (is.available() != 0);
            res = bos.toByteArray();
            ReceiveData = new String(res,"ISO-8859-1");

        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            try {
                if (is != null) {
                    is.close();
                }
                if (socket != null)
                    socket.close();
            } catch (Exception e) {
            }
        }
        return ReceiveData;
    }
}
           

第三步

解析返回的数据包,按一定规则

public static PayDO TransVerific(String Vlaue) {


        PayDO model = new PayDO();
        model.setState(Integer.parseInt("1"));
        model.setResult_str("查询缴费信息错误!");
        try {
            String lenStr = Vlaue.substring(0, 4);//包长度
            String VERIFY = Vlaue.substring(4, 6);//功能号
            String serial = Vlaue.substring(6, 10);//序列号

            String valid_flag = Vlaue.substring(10, 11);//学生卡是否有效
            String AccountID = Vlaue.substring(11, 23);//一卡通账号
            String CreateTime = Vlaue.substring(23, 40);//开户时间
            String Stu_Name = Vlaue.substring(40, 100);//学生姓名

            byte[] b = Stu_Name.getBytes("ISO-8859-1");//用tomcat的格式(iso-8859-1)方式去读。
            Stu_Name = new String(b, "GBK");//采用utf-8去接string

            String Stu_Class = Vlaue.substring(100, 130);//班级

            byte[] b1 = Stu_Class.getBytes("ISO-8859-1");//用tomcat的格式(iso-8859-1)方式去读。
            Stu_Class = new String(b1, "GBK");//采用utf-8去接string

            String Stu_StudyID = Vlaue.substring(130, 150);//学号
            String payMoney = Vlaue.substring(150, 160);//应缴金额
            String Sign = Vlaue.substring(160);//签名

            model.setState(1);
            model.setResult_str("失败,命令码:" + valid_flag);

            //需要加签的str
            String SignStr = Processing.getIntVlaue(Integer.parseInt(valid_flag), 1)
                    + Processing.getIntVlaue(Integer.parseInt(AccountID), 12)
                    + Processing.getStrVlaue(CreateTime, 17);

            if (checkSign(model, Sign, SignStr)) return model;//验签

            Object serialO = request.getServletContext().getAttribute("queryStuSerial");
            if (!serial.equals(serialO)) {
                model.setState(1);
                model.setResult_str("序列号错误!");
                return model;
            } else if (!VERIFY.equals("36")) {
                model.setState(1);
                model.setResult_str("命令码错误!");
                return model;
            } else if (valid_flag.equals("1")) {
                model.setState(1);
                model.setResult_str("账号无对应信息!");
                return model;
            } else if (valid_flag.equals("2")) {
                model.setState(1);
                model.setResult_str("账号重复!");
                return model;
            } else if (valid_flag.equals("3")) {
                model.setState(1);
                model.setResult_str("账号姓名不符!");
                return model;
            } else if (valid_flag.equals("4")) {
                model.setState(1);
                model.setResult_str("连接一卡通服务失败!");
                return model;
            } else if (valid_flag.equals("5")) {
                model.setState(1);
                model.setResult_str("账户状态异常!");
                return model;
            } else if (valid_flag.equals("6")) {
                model.setState(1);
                model.setResult_str("其它错误!");
                return model;
            }

            model.setState(0);
            model.setResult_str("查询缴费信息成功!");

            model.setCreateTime(CreateTime);
            model.setStudentName(Stu_Name.trim());
            model.setClassification(Stu_Class.trim());
            model.setStudentId(Stu_StudyID.trim());
            model.setPayMoney((double) (Integer.parseInt(payMoney) / 100));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return model;
    }
           

下边是其中的验签方法

/**
     * 验签方法
     *
     * @param model
     * @param sign
     * @param signStr
     * @return
     */
    private static boolean checkSign(PayDO model, String sign, String signStr) {
        String check = com.yhk.weixin.utils.socket.ReadProperties.getUrlValue("check");
        String Sign1 = Processing.md5(signStr + check);
        //验签
        if (!Sign1.equals(sign)) {
            model.setState(1);
            model.setResult_str("签名不一致!");
            return true;
        }
        return false;
    }
           

继续阅读