⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmpp_get_smg.java

📁 CMPP3.0移动短信程序java源程序
💻 JAVA
字号:
package com.sxforever.protocol.cmpp30;
import java.net.Socket;
import java.io.OutputStream;
import java.io.InputStream;
import com.sxforever.queue.*;
import java.util.Calendar;
import com.sxforever.socket.SocketManager;
import com.sxforever.util.Log;
import com.sxforever.structure.Submit;
import com.sxforever.structure.DELIVER;
/**
 * <p>Title: sxforever</p>
 *
 * <p>Description: </p>
 *
 * <p>Copyright: Copyright (c) 2007</p>
 *
 * <p>Company: Hengyuan_COM</p>
 *
 * @author shanying
 * @version 1.0
 */
public class CMPP_GET_SMG implements Runnable {
    OutputStream OutSend = null;//发送通道
    InputStream InSend = null;//接收通道
    Socket CMPP_Socket;
    CMPP_CONNECT conn=new CMPP_CONNECT();//发送类
    CONN_RESP resp=new CONN_RESP();//接收处理类
    CMPPSubmitQueue Submit=CMPPSubmitQueue.getInstance();
    Log info=new Log();

    private static boolean flag=true;
    public CMPP_GET_SMG() throws Exception{
        CMPP_Socket = new SocketManager("127.0.0.1","901236","1236","",3,7890,3*60*1000).getSocket();
    }
    public static void stopThread(){
        flag=false;
    }
    public void run(){
        //开始连接
        while(!connect()){}
        Calendar TIME=Calendar.getInstance();//时间对象getTimeInMillis()
        long time = TIME.getTimeInMillis();
        //long time1;
        int huakuai=0,xy=0,infolong=0;
        MyDeliver md = MyDeliver.getInstance();
        MDELIVER Mydeli=new MDELIVER();
        //DELIVER deli=new DELIVER();
        DeliverQueue delQu=DeliverQueue.getInstance();
        while (flag) {
            try{
                //时间到就下发链路包
                TIME=Calendar.getInstance();
                if (TIME.getTimeInMillis()-time>30*1000){
                    time = TIME.getTimeInMillis();
                    info.printEvent("系统空闲","./logs/cmpp.log");
                    OutSend.write(conn.set_Active_Test());huakuai++;}
                else if (Submit.getSize() > 0){//从队列中取出信息
                    info.printEvent("系统正在下发信息","./logs/cmpp.log");
                    OutSend.write(conn.set_sunmit(Submit.remove()));huakuai++;}

                //接收信息
                InSend = CMPP_Socket.getInputStream();
                infolong=InSend.available();
                if (infolong>0){
                    info.printEvent("系统正在接收信息","./logs/cmpp.log");
                    TIME=Calendar.getInstance();
                    time = TIME.getTimeInMillis();huakuai=0;//如果收到信息,时间修改为当前时间,滑块清零
                    int a11=InSend.available();
                    byte[] msg11=new byte[a11];
                    InSend.read(msg11);//6如果收到信息长度不为零就交给CONN_RESP处理
                    resp.msg=msg11;
                    resp.conn_msg();//处理收到信息
                    while (md.getSize()>0){//如里有信息就回应,并且将DELIVER加入队列
                        Mydeli=md.remove();
                        info.printEvent("系统正在将DELIVER转给业务","./logs/cmpp.log");
                        OutSend.write(conn.set_Deliver_resp(Mydeli));
                        delQu.add(MDELIVER2DELIVER(Mydeli));
                    }
                }
                else if(huakuai>=15){//如果发出大于15条信息依然没有收到回应,则等待回应
                    info.printEvent("滑块达到最大值,系统正在等待回应","./logs/cmpp.log");
                    while (infolong == 0) {
                        Thread.sleep(100);
                        InSend = CMPP_Socket.getInputStream();
                        infolong = InSend.available();
                        TIME=Calendar.getInstance();
                        if (TIME.getTimeInMillis()-time>30*1000){
                            info.printEvent("等待回应超时,准备重连","./logs/cmpp.log");
                            terminate();//拆除连接
                            connect();//重新连接
                        }
                    }
                    TIME=Calendar.getInstance();
                    time = TIME.getTimeInMillis();huakuai=0;//如果收到信息,时间修改为当前时间,滑块清零
                    int a11=InSend.available();
                    byte[] msg11=new byte[a11];
                    InSend.read(msg11);//6如果收到信息长度不为零就交给CONN_RESP处理
                    resp.msg=msg11;
                    resp.conn_msg();//处理收到信息
                    while (md.getSize()>0){//如里有信息就回应,并且将DELIVER加入队列
                        Mydeli=md.remove();
                        OutSend.write(conn.set_Deliver_resp(Mydeli));
                        delQu.add(MDELIVER2DELIVER(Mydeli));
                    }
                }
                //7等待XXX毫秒
            }
            catch(Exception ex){info.printError(ex, "", "./logs/cmpp.log");}
        }
        //拆除连接
        while(!terminate()){}
    }
    private boolean connect(){
        boolean ret=false;
        try {
            info.printEvent("-----------线程启动准备连接----------","./logs/cmpp.log");
            OutSend = CMPP_Socket.getOutputStream();
            OutSend.write(conn.set_conn_info("901236", "1236"));
            InSend = CMPP_Socket.getInputStream();
            int b=InSend.available();
            while (b == 0) {
                Thread.sleep(100);
                InSend = CMPP_Socket.getInputStream();
                b = InSend.available();
            }
            byte[] temp = new byte[4];
            InSend.read(temp);
            int a1 = TypesTools.byte2int(temp);
            if (a1 == 33) {
                InSend.skip(8);
                InSend.read(temp, 0, 4);
                InSend.skip(17);
                switch (TypesTools.byte2int(temp)) {
                case 0:
                    {info.printEvent("连接正确","./logs/cmpp.log");
                    ret=true;
                    break;}
                case 1:
                    info.printEvent("消息结构错","./logs/cmpp.log");
                    break;
                case 2:
                    info.printEvent("非法源地址","./logs/cmpp.log");
                    break;
                case 3:
                    info.printEvent("认证错","./logs/cmpp.log");
                    break;
                case 4:
                    info.printEvent("版本太高","./logs/cmpp.log");
                    break;
                default:
                    info.printEvent("其它","./logs/cmpp.log");
                }
            }
        }catch (Exception ex) {
            info.printError(ex,"","./logs/cmpp.log");
        }
        return ret;
    }
    private DELIVER MDELIVER2DELIVER(MDELIVER mdel)throws Exception{
        DELIVER deli=new DELIVER();
        deli.GATETYPE=mdel.GATETYPE;//网关类型移动:CM,联通:UN,网通:CNC
        deli.Str_MSGID = mdel.Str_MSGID; //信息标识(如果是状态报告,这里填要更新的下行的信息标识)
        deli.Str_USERNUM = mdel.Str_USERNUM; //手机号码
        deli.Str_SPNUM = mdel.Str_SPNUM; //SP接入号或者长号
        deli.By_MSGFMT = mdel.By_MSGFMT; //短消息编码格式Msg_Fmt信息格式0asc,3短信写卡,4二进制,8ucs2,15gb汉字
        deli.Int_MSGLENGTH = mdel.Int_MSGLENGTH; //短消息的长度
        switch(mdel.By_MSGFMT){
        case 0:
            deli.Str_MSG = new String(mdel.Str_MSG, "GBK"); //短消息内容
            break;
        case 3:
            deli.Str_MSG = new String(mdel.Str_MSG, "GBK"); //短消息内容
            break;
        case 4:
            deli.Str_MSG = new String(mdel.Str_MSG, "GBK"); //短消息内容
            break;
        case 8:
            deli.Str_MSG = new String(mdel.Str_MSG, "iso-10646-ucs-2"); //短消息内容
            break;
        case 15:
            deli.Str_MSG = new String(mdel.Str_MSG, "GBK"); //短消息内容
        }

        deli.Str_LINKID = mdel.Str_LINKID; //联通、移动
        deli.By_TPPID = mdel.By_TPPID; //联通、移动
        deli.By_TPUDHI = mdel.By_TPUDHI; //联通、移动
        deli.By_ISREPORT = mdel.By_ISREPORT; //移动、网通,是否为状态报告,0:不是,1:是,联通通过判断添加该字段
        deli.Str_SERVICEID = mdel.Str_SERVICEID; //移动特有,业务代码
        deli.By_USERNUMTYPE = mdel.By_USERNUMTYPE; //移动特有,源终端号码类型,0:真实号码,1:伪码
        deli.Str_RECVTIME = mdel.Str_RECVTIME; //网通特有,接收时间
        deli.Str_STAT = mdel.Str_STAT; //状态报告,当前状态
        deli.Str_ERRORCODE = mdel.Str_ERRORCODE; //状态报告,错误代码(移动的填STAT)
        deli.Str_SUBMITTIME = mdel.Str_SUBMITTIME; //状态报告,短信提交给短信中心的时间(联通的填接收到报告的时间)
        deli.Str_DONETIME = mdel.Str_DONETIME; //状态报告,完成短信发送的时间(联通的填接收到报告的时间)
        deli.Str_D_S = mdel.Str_D_S; //
        if (mdel.By_ISREPORT==1){
            byte[] a1={0};
            String a2=new String(a1);
            deli.Str_MSGID=(new String(resp.SplitBytes(mdel.Str_MSG,0,8))).replaceAll(a2,"");
            deli.Str_STAT=(new String(resp.SplitBytes(mdel.Str_MSG,8,7))).replaceAll(a2,"");
            deli.Str_ERRORCODE=(new String(resp.SplitBytes(mdel.Str_MSG,8,7))).replaceAll(a2,"");
            deli.Str_SUBMITTIME=(new String(resp.SplitBytes(mdel.Str_MSG,15,10))).replaceAll(a2,"");
            deli.Str_DONETIME=(new String(resp.SplitBytes(mdel.Str_MSG,25,10))).replaceAll(a2,"");
        }
        return deli;
    }
    private boolean terminate() {
        boolean ret = false;
        try {
            info.printEvent("-----------线程准备拆除连接----------","./logs/cmpp.log");
            OutSend.write(conn.setMessHead(12, 0x00000002));
            InSend = CMPP_Socket.getInputStream();
            byte[] temp1 = new byte[4];
            int b = 0;
            b = InSend.available();
            while (b == 0) {
                Thread.sleep(100);
                InSend = CMPP_Socket.getInputStream();
                b = InSend.available();
            }
            if (b > 12) {
                InSend.skip(b - 12);
                b = InSend.available();
            } else {
                if (b < 12) {
                    info.printEvent("拆除连接错误", "./logs/cmpp.log");
                }
            }
            if (b == 12)
                InSend.read(temp1);
            int a1 = TypesTools.byte2int(temp1);
            if (a1 == 12) {
                info.printEvent("已拆除连接", "./logs/cmpp.log");
            } else {
                info.printEvent("拆除连接错误", "./logs/cmpp.log");
            }
        } catch (Exception ex) {
            info.printError(ex, "", "./logs/cmpp.log");
        }
        return ret;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -