协议都是双方统一的
java端定义的报文
package cn.com.henan.socket;
import java.util.Calendar;
//此类试图将所有的通讯协议的编解码都包含在内!按照一次交互的过程来区分
public class newsDetail implements InewsDetail
{
protected int netErr; //用来表示是不是网络出错了,主要是超时。这个时候就不需要检查其他参数了。
protected int type; //就是对应具体的操作类型码
protected byte[] StreamID=new byte[16]; //对应具体的流水号
protected byte[] asyn = new byte[2];
//这个还是有问题 不能达到预计效果 需要修改
static private int seq=0; //生成流水号后2位的时候使用的
static private Calendar lastCa;
public newsDetail()
{
getStreamID();
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
//基类中的编解码函数没有作用,具体使用的编解码函数在各个子类中需要重新实现
//必须有返回值 因为调用者需要根据返回值做一些操作
//这里的参数 buf是需要填写的缓冲区 start 是缓冲区开始位置 len 是可用的缓冲区长度
public int encode(byte[] buf,int start,int len)
{
return 0;
}
//这里的参数 buf是需要需要解码的缓冲区 start 是缓冲区开始位置 len 是需要解码的长度
public int decode(byte[] buf,int start,int len)
{
return 0;
}
public void getStreamID()
{
Calendar ca = Calendar.getInstance();
int year = ca.get(Calendar.YEAR);//获取年份
int month=ca.get(Calendar.MONTH)+1;//获取月份
int day=ca.get(Calendar.DATE);//获取日
int minute=ca.get(Calendar.MINUTE);//分
int hour=ca.get(Calendar.HOUR);//小时
int second=ca.get(Calendar.SECOND);//秒
int am_pm=ca.get(Calendar.AM_PM);
if (am_pm==Calendar.PM)
hour += 12;
if (hour>=24)
hour -= 24;
System.out.println(seq);
if (lastCa!=ca)
{
lastCa = ca;
seq = 12;
}
else
{
seq++;
if (seq>=100)
seq = 0;
}
//现在根据上面的字段组成StreamID字符串
//目前先使用手工的办法来写,效率高一些
StreamID[0] = (byte)(year/1000+'0');
StreamID[1] = (byte)((year-(StreamID[0]-'0')*1000)/100+'0');
StreamID[2] = (byte)((year-(StreamID[0]-'0')*1000-(StreamID[1]-'0')*100)/10+'0');
StreamID[3] = (byte)(year-(StreamID[0]-'0')*1000-(StreamID[1]-'0')*100-(StreamID[2]-'0')*10+'0');
StreamID[4] = (byte)(month/10+'0');
StreamID[5] = (byte)((month-(StreamID[4]-'0')*10)+'0');
StreamID[6] = (byte)(day/10+'0');
StreamID[7] = (byte)((day-(StreamID[6]-'0')*10)+'0');
StreamID[8] = (byte)(hour/10+'0');
StreamID[9] = (byte)((hour-(StreamID[8]-'0')*10)+'0');
StreamID[10] = (byte)(minute/10+'0');
StreamID[11] = (byte)((minute-(StreamID[10]-'0')*10)+'0');
StreamID[12] = (byte)(second/10+'0');
StreamID[13] = (byte)((second-(StreamID[12]-'0')*10)+'0');
StreamID[14] = (byte)(seq/10+'0');
StreamID[15] = (byte)((seq-(StreamID[14]-'0')*10)+'0');
System.out.println("现在时间");
System.out.println("用Calendar.getInstance().getTime()方式显示时间: " + ca.getTime());
System.out.println("用Calendar获得日期是:" + year +"年"+ month +"月"+ day + "日");
System.out.println("用Calendar获得时间是:" + hour +"时"+ minute +"分"+ second +"秒");
}
public static void main(String[] args)
{
{
newsDetail nn1 = new newsDetail();
}
try {
Thread.currentThread().sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
{
newsDetail nn2 = new newsDetail();
}
}
}
package cn.com.henan.socket;
//针对操作类型码0x05 主要是发送彩信给指定用户使用的 add by ysen
public class newsDetailMMS extends newsDetail
{
//发送方设置
private String mmsfile; //需要发送的文件名
private int mmsfileL; //彩信内容长度
private int isdnnum; //接受方号码总数
private String[] isdn; //接受方号码
//接受方解码设置
private int result; //接受结果
private int recvisdnnum;//实际接收的号码数
private String resultMessage;//操作解析的结果
public newsDetailMMS() {
super();
}
public int encode(byte[] buf,int start,int len)
{
//如果可用缓冲区小于最小字节要求 直接退出
if(len<21)
return -1;
int step=start;
System.out.println("This is a newsDetailMMS encode!");
buf[step] = (byte)0x88;
step++;
buf[step] = (byte)0x88;
step++;
//长度 先预留 最后填写
step+=2;
for (int i=0;i<16;i++)
buf[step+i] = this.StreamID[i];
step += 16;
buf[step] = (byte)(this.type);
step ++;
buf[step] = (byte)(this.mmsfileL);
step ++;
for(int i=0;i<this.mmsfileL;i++){
buf[step++]=this.mmsfile.getBytes()[i];
}
buf[step] = (byte) isdnnum;
step ++;
for(int i=0;i<this.isdnnum;i++){
for(int num=0;num<11;num++){
buf[step++]=this.isdn[i].getBytes()[num];
}
}
//最后填写出长度字段 step-start-20
buf[start+2] = (byte)((step-start-20)&0xff);
buf[start+3] = (byte)(((step-start-20)>>8)&0xff);
return step;
}
//如果返回0 表示解码数据还不完整 正数就是解码的字节数 负数表示解码出错
public int decode(byte[] buf,int start,int len)
{
int step=0;
int ltype; //就是对应具体的操作类型码
byte[] lStreamID = new byte[16];
byte[] lasyn = new byte[2];
int datalen=0;
System.out.println("This is a newsDetailMMS decode!");
//如果头部还没有接受完整就不解码
if (len<=20)
return 0;
lasyn[0] = buf[step];
step++;
lasyn[1] = buf[step];
step++;
//如果同步码不正确 后面就不需要解码了
if ((lasyn[0]!=(byte)0x88)||(lasyn[1]!=(byte)0x88))
return -1;
datalen = (buf[step]&0xff)+(buf[step+1]<<8)&0xff00;
step += 2;
//如果数据部分还没有接受完全 也要退出
if (datalen+20>len)
return 0;
for (int i=0;i<16;i++)
{
lStreamID[i] = buf[step+i];
//如果STREAMID不一样 出错退出
if (lStreamID[i]!=this.StreamID[i])
return -1;
}
step += 16;
ltype = buf[step];
step++;
if (ltype!=this.type)
return -1;
result = buf[step];
step++;
recvisdnnum = buf[step];
step++;
return step;
}
public String getResultMessage() {
switch(this.result){
case(1):this.resultMessage="成功,完整接收到所有号码";
break;
case(2):this.resultMessage="成功,只接收到部分号码";
break;
case(3):this.resultMessage="失败,彩信文件不存在";
break;
default:this.resultMessage="失败原因未知";
}
return resultMessage;
}
public void setResultMessage(String resultMessage) {
this.resultMessage = resultMessage;
}
public String getMmsfile() {
return mmsfile;
}
public void setMmsfile(String mmsfile) {
this.mmsfile = mmsfile;
}
public int getMmsfileL() {
return mmsfileL;
}
public void setMmsfileL(int mmsfileL) {
this.mmsfileL = mmsfileL;
}
public int getIsdnnum() {
return isdnnum;
}
public void setIsdnnum(int isdnnum) {
this.isdnnum = isdnnum;
}
public String[] getIsdn() {
return isdn;
}
public void setIsdn(String[] isdn) {
this.isdn = isdn;
}
public int getResult() {
return result;
}
public void setResult(int result) {
this.result = result;
}
public int getRecvisdnnum() {
return recvisdnnum;
}
public void setRecvisdnnum(int recvisdnnum) {
this.recvisdnnum = recvisdnnum;
}
public static void main(String[] args)
{
}
}