基於CMPP2.0的Socket客戶端(Java) - 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;
}
相關文章
- 使用java語言基於SMTP協議手寫郵件客戶端Java協議客戶端
- 基於c語言的TCP客戶端、服務端基礎程式碼C語言TCP客戶端服務端
- C語言透過socket實現TCP客戶端C語言TCP客戶端
- 基於c語言的UDP客戶端、服務端二合一基礎程式碼C語言UDP客戶端服務端
- C++客戶端程式(socket)C++客戶端
- Socket最簡單的客戶端與服務端通訊-Java客戶端服務端Java
- Java Socket程式設計系列(三)開發支援單客戶端訪問的ServerJava程式設計客戶端Server
- 「完整案例」基於Socket開發TCP傳輸客戶端TCP客戶端
- java websocket 客戶端JavaWeb客戶端
- Python socket的客戶端Python客戶端
- 如何用Java Socket實現一個簡單的Redis客戶端JavaRedis客戶端
- zookeeper的Java客戶端APIJava客戶端API
- Zookeeper Java 客戶端搭建Java客戶端
- Zookeeper--Java客戶端Java客戶端
- 基於Grafana和Prometheus的監視系統(3):java客戶端使用GrafanaPrometheusJava客戶端
- 基於java的客戶關係管理系統Java
- Java OAuth 2.0 客戶端程式設計(二): 客戶端憑據授權JavaOAuth客戶端程式設計
- 客戶端的socket是否需要bind?客戶端
- JAVA FTP客戶端問題JavaFTP客戶端
- 基於R語言的航空公司客戶價值分析R語言
- [Redis 客戶端整合] Java 中常用Redis客戶端比較Redis客戶端Java
- MQTT客戶端JAVA程式碼----fusesource mqtt-clientMQQT客戶端Javaclient
- [jaeger] 二、客戶端使用 (Java版本)客戶端Java
- Elasticsearch及java客戶端jest使用ElasticsearchJava客戶端
- linux網路程式設計之用socket實現簡單客戶端和服務端的通訊(基於TCP)Linux程式設計客戶端服務端TCP
- Socket程式設計入門(基於Java實現)程式設計Java
- 實現伺服器和客戶端資料互動,Java Socket有妙招伺服器客戶端Java
- [轉載] 使用Redis的Java客戶端JedisRedisJava客戶端
- Jaeger的客戶端取樣配置(Java版)客戶端Java
- Java HTTP 客戶端的比較 - reflectoringJavaHTTP客戶端
- zookeeper Java客戶端API的使用方法Java客戶端API
- Java Socket程式設計系列(四)開發支援多客戶端訪問的ServerJava程式設計客戶端Server
- java語言屬於哪種語言Java
- Tars-Java客戶端原始碼分析Java客戶端原始碼
- java 獲取客戶端真實ipJava客戶端
- java獲取客戶端ip和macJava客戶端Mac
- Redis介紹 && Java客戶端操作RedisRedisJava客戶端
- 如何建立一個Java遊戲客戶端Java遊戲客戶端