基于CMPP2.0的Socket客户端(Java)

短信验证码,短信通知等功能均可通过此Socket客户端实现。

注意事项如下:

1、服务器端是按字节依次读取的,所以客户端发送的字节包中的字段要严格按照CMPP协议中的顺序,而且每个字段都要有。

2、每个字段的实际长度不足时,用0补齐;电话号码后用空格补齐

3、使用ByteBuffer时,要注意putInt()和put()的区别

我亲身实践出来的模板如下,供大家参考学习:

public class Login {

public static int pktLen;

public static int reqId;

public static int seqId;

public static byte[] source_Addr = new byte[6];

public static byte[] authenticatorSource = new byte[16];

public static int timeStamp;

public static byte version;

private String strtimeStamp;

private String loginPwd="xxxxxxxx";

private String spId="123456";

private String spPwd;

public Login(int i)throws UnsupportedEncodingException,NoSuchAlgorithmException {

pktLen = 39;

reqId = 0x00000001;

version = 0x10;

seqId = i;

source_Addr=spId.getBytes();

SimpleDateFormat sf =  new SimpleDateFormat("MMddHHmmss");

strtimeStamp = sf.format(new Date());

timeStamp = Integer.valueOf(strtimeStamp).intValue();

byte[] testa={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

spPwd=spId+new String(testa)+loginPwd+strtimeStamp;

authenticatorSource=Login.Md5(spPwd);

}

public static void main(String[] args) throws UnknownHostException, IOException, NoSuchAlgorithmException{

Socket socket =null;

socket = new Socket("2xx.6x.10x.19x", 9890);

new Login(1);

OutputStream os = socket.getOutputStream();

os.write(Login.toBytes());

os.flush();

InputStream inputStream = socket.getInputStream();

if((inputStream.read())==0)

{

System.out.println("login successfully");

}

os.write(Login.messageToBytes());

os.flush();

int a =0;

inputStream.skip(25);

while((a=inputStream.read())!=-1){

System.out.println("RESULT: "+a);

}

}

private static byte[] Md5(String str)throws NoSuchAlgorithmException, UnsupportedEncodingException {

MessageDigest md5 = MessageDigest.getInstance("MD5");

md5.update(str.getBytes("UTF8"));

byte[] temp;

temp = md5.digest("".getBytes("UTF8"));

return  temp;

}

public static byte[] toBytes(){

byte[] b = new byte[39];

ByteBuffer bb = ByteBuffer.wrap(b, 0, 39);

bb.order(ByteOrder.BIG_ENDIAN);

bb.putInt(pktLen);

bb.putInt(reqId);

bb.putInt(seqId);

bb.put(source_Addr);

bb.put(authenticatorSource);

bb.put(version);

bb.putInt(timeStamp);

return b;

}

public static byte[] messageToBytes(){

int Total_Length=171;

int Command_Id =4;

int Sequence_Id = 2;

byte[] Msg_id=new byte[8];

byte PK_total=1;

byte PK_number=1;

byte Registered_Delivery=1;

String Service_Id = "testmsg111";

byte Msg_level=1;

byte Fee_UserType=0;

byte[] Fee_terminal_Id=new byte[21];

byte TP_pId=0;

byte TP_udhi=0;

byte Msg_Fmt=0;

byte[] Msg_src=new byte[6];

byte[] FeeType=new byte[2];

byte[] FeeCode=new byte[6];

String ValId_Time = "00000000000000000";

String At_Time = "00000000000000000";

byte[] Src_Id=new byte[21];

byte DestUsr_tl;

byte[] Dest_terminal_Id=new byte[21];

byte Msg_Length;

byte[] Msg_Content;

byte[] Reserve=new byte[8];

Msg_src="200030".getBytes();

FeeType="01".getBytes();

FeeCode="000010".getBytes();

Src_Id="000000000001069034531".getBytes();

DestUsr_tl=1;

Dest_terminal_Id="000000000018511790624".getBytes();

Msg_Length=12;

Msg_Content="digitalchina".getBytes();

byte[] b = new byte[171];

ByteBuffer bb = ByteBuffer.wrap(b, 0, 171);

bb.order(ByteOrder.BIG_ENDIAN);

bb.putInt(Total_Length);

bb.putInt(Command_Id);

bb.putInt(Sequence_Id);

bb.put(Msg_id);

bb.put(PK_total);

bb.put(PK_number);

bb.put(Registered_Delivery);

bb.put(Msg_level);

bb.put(Service_Id.getBytes());

bb.put(Fee_UserType);

bb.put(Fee_terminal_Id);

bb.put(TP_pId);

bb.put(TP_udhi);

bb.put(Msg_Fmt);

bb.put(Msg_src);

bb.put(FeeType);

bb.put(FeeCode);

bb.put(ValId_Time.getBytes());

bb.put(At_Time.getBytes());

bb.put(Src_Id);

bb.put(DestUsr_tl);

bb.put(Dest_terminal_Id);

bb.put(Msg_Length);

bb.put(Msg_Content);

bb.put(Reserve);

bb.position();

return b;

}

时间: 2024-12-17 16:41:20

基于CMPP2.0的Socket客户端(Java)的相关文章

Java网络编程基础(二)-- 基于TCP/IP的Socket编程

本节讲点: 客户端套接字:Socket:Socket的创建和使用方法,以及Socket选项和异常. 服务端套接字:ServerSocket:SeverSocket的创建和使用方法,以及ServerSocket选项 简单的Client/Server对话程序 支持多客户端的Client/Server服务响应程序 在学习JDK的网络编程之前先要了解一下网络基础知识和网络协议. TCP(传输控制协议)一种基于连接的通信协议.可靠传输 UDP(用户数据包协议)不稳定连接的通信协议 TCP和UDP的端口如下

基本的Socket编程-基于Swing和AWT的客户端

import java.net.ServerSocket; import java.net.Socket; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.IOException; import java.io.BufferedReader; import java.io.PrintStream; /** ServerSocket服务端 */ public class SimpleServ

java 网络编程 TCP协议 java 服务器和客户端 java socket编程

一个 HelloWord 级别的 Java Socket 通信的例子.通讯过程:        先启动 Server 端,进入一个死循环以便一直监听某端口是否有连接请求.然后运行 Client 端,客户端发出连接请求,服务端监听到这次请求后向客户端发回接受消息,连接建立,启动一个线程去处理这次请求,然后继续死循环监听其他请求.客户端输入字符串后按回车键,向服务器发送数据.服务器读取数据后回复客户端数据.这次请求处理完毕,启动的线程消亡.如果客户端接收到 "OK" 之外的返回数据,会再次

java.net.SocketException:Software caused connection abort: recv failed 异常分析 +socket客户端&服务端代码

java.net.SocketException:Software caused connection abort: recv failed 异常分析 分类: 很多的技术 2012-01-04 12:54 8004人阅读 评论(6) 收藏 举报 socket服务器bufferstring网络java 第 1个异常是java.net.BindException:Address already in use: JVM_Bind.该异常发生在服务器端进行new ServerSocket(port)(p

Android 客户端Socket 与 Java服务端ServerSocket 简单小例子

新建一个Java项目 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public

Java学习笔记之基于TCP协议的socket

可以一直输入,而不是一问一答: 开两个线程,一个负责收,一个负责发. 1.先运行: package com.zr.javase0825; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.Server

IdentityServer4客户端JWT解密实现(基于.net4.0)

情景:公司项目基于.net4.0,web客户端实现单点登录需要自己解密id_token,对于jwt解密,.net提供了IdentityModel类库,但是4.0中该类库不可用,所以自己实现了解密方法.. 使用了类库:https://github.com/jwt-dotnet/jwt 下面直接贴代码,直接调用DecodeJWT方法就行,参数为id_token,key默认为空字符串"", public static IDictionary<string, object> Dec

网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服务器进程B1同时为客户进程A1.A2和B2提供服务. Socket概述 ①   所谓Socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过“套接字”向网络发出请求或者应答网络请求. ②   Socket是连接运行在网络上的两个程序间的双向通信的端点. ③  

基于多线程的TCP socket通信经典案例

服务器端 package com.thinkvenus.study.socket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; /** *