联通基于SGIP短信SMPP(socket)网关实现方式

数据的处理:

socket发送的16进制的byte流;需要将对应的数据类型转为byte[] 方式;

Login Name

16

Text

服务器端给客户端分配的登录名

比如以上的数据类型;

String loginName = "userName";可以看到其实只有7个字节,那么就需要根据指定的要求前向或者向后补齐;

byte[] userName = loginName .getBytes();
// 而实际需要16个字节,不够向后补0
// 创建16个自己的的数组
byte[] newUserName = new byte[16];
// 将新的数组全部初始化为0
Arrays.fill(newUserName,(byte)0x00);
// 向后补齐0
System.arraycopy(userName,  0, newUserName, 0, userName.length);
//这样子就得到了我们需要的byte数组;

各种类型的转换:

// 1String类型直接getBytes()即可
// 2 int/Integer类型
public static byte[] intToByteArray1(int a) {
	return new byte[] { (byte) ((a >> 24) & 0xFF), (byte) ((a >> 16) & 0xFF), (byte) ((a >> 8) & 0xFF),(byte) (a & 0xFF) };
	}
//Text类型与String类型相同

 

获取消息体的长度:

// 比如head中 有comandId 123456  长度为4字节  Integer类型
// body中有pwd 123456 text类型 长度为12 Text类型
// 长度一般在头文件中 如len 4字节  Integer类型
// 那么首先获取head body的长度和  然后+4(消息体的长度字段)即可获取消息体的长度
byte[] sequenceId = TurnOffUtils.intToByteArray1(123456);
byte[] passWord = pwd.getBytes();
byte[] newPassWord = new byte[16];
System.arraycopy(passWord, 0, newPassWord, 0, passWord.length);
// 将byte[]合并在一起
public static byte[] byteMergerAll(byte[]... values) {
int length_byte = 0;
for (int i = 0; i < values.length; i++) {
	length_byte += values[i].length;
}
byte[] all_byte = new byte[length_byte];
int countLength = 0;
for (int i = 0; i < values.length; i++) {
    byte[] b = values[i];
	System.arraycopy(b, 0, all_byte, countLength, b.length);
	countLength += b.length;
		}
		return all_byte;
	}
byte[] seq = TurnOffUtils.byteMergerAll(code, nowTimeByte,sequenceId);
// 那么消息体的总长度为len = seq.length+4;
// 将消息体长度也转为byte[]
byte[] msgLenBytes = TurnOffUtils.intToByteArray1(len);// int就是8位4字节 所以直接满足
// 再将消息长度的byte[]数组和消息体合并调用byte的合并方法即可
byte[] msg = TurnOffUtils.byteMergerAll(msgLenBytes , seq);
// 发送socket请求
Socket socket;
DataOutputStream out;
// 客户端创建Socket对象 并且和服务端10011端口连接
socket = new Socket(CheckingUtils.readValue("resource/info.properties", "ip"), 8801);
// 客户端读取数据流
BufferedInputStream in = new BufferedInputStream(socket.getInputStream());
// 向服务器端发送数据
out = new DataOutputStream(socket.getOutputStream());
// write即可 完事flush()
out.write(msg);
out.flush();

客户端读取服务端返回的数据:

// 客户端读取数据
			byte[] result = new byte[1024];
			int read;
			while (true) {
				read = in.read(result);
				if (read < 0) {
					break;
				}
			}
System.out.println("返回信息长度" + read);
			for (int i = 0 ; i < read; i++) {
				System.out.print(result[i]);
			}
// 最后不要忘了关闭
out.close();
in.close();
socket.close();

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值