📄 cmpp_get_smg.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 + -