数据的处理:
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();