java 创建TCP连接并同时接受服务端响应的信息
2023-12-15 19:48:07
java 创建TCP连接发送16进制数据并同时接受服务端响应16进制数据,并解析成可供人们可读的10进制数据返回
简介:
? ? ? ? 这是我做一个物联网项目,项目需要我对机器发送一些16进制的字符串指令,然后呢对端机器就会给我返回个一组16进制数据,此时我需要解析成可供人们可读的10进制数据返回给前端,机器的连接方式是TCP不是常规HTTP。
源代码:
建立TCP连接,建立输入以及输出流
public static void main(String[] args) throws Exception {
// 实例化Socket对象,连接端口502服务器建立通信通道
Socket socket = new Socket("192.168.87.141", 502);
//要传给对端的数据
String reqString = "00 00 00 00 00 02 01 03 00 11 00 01";
//建立输出流,准备输出数据
OutputStream outputStream = socket.getOutputStream();
//因为我的数据是16进制需要给他转成对象的字节数组才能传送
byte[] bytes = hexStringToByteArray(reqString);
//建立输入流,准备接受数据
InputStream inputStream = socket.getInputStream();
//发送信息
outputStream.write(bytes);
//将对端返回的数据进行解析
Integer count = streamTransStr(inputStream);
}
16进制字符串转换为字节数组
/**
* 16进制字符串转换为字节数组
*
* @param hexString: 16进制化后的字符串
* @return byte[]
* @author A乐神
* date 2023/12/15
**/
public static byte[] hexStringToByteArray(String hexString) throws InterruptedException {
hexString = hexString.replaceAll(" ", "");
int len = hexString.length();
byte[] bytes = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
// 两位一组,表示一个字节,把这样表示的16进制字符串,还原成一个字节
bytes[i / 2] = (byte) ((Character.digit(hexString.charAt(i), 16) << 4) + Character
.digit(hexString.charAt(i + 1), 16));
}
//上述循环有个很大问题,是java本身问题,不睡眠等一下的话,可能代码16进制字符串转字节数组转换还没完成,就已经开始执行下一行了
//这个时间可以自行缩短
Thread.sleep(1000);
return bytes;
}
对端返回的tcp信息解析,我的是16进制返回值解析成10进制,读者可以根据自己业务进行更改。
public static Integer streamTransStr(InputStream inputStream) throws IOException {
StringBuilder stringBuilder = new StringBuilder();
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) != -1) {
for (int i = 0; i < length; i++) {
//对端返回的是16进制数,但是字节需要先用10进制存,下面意思是读取1个字节并用10进制可读取的int表示
int tenSys = buffer[i] & 0xFF;
// toHexString作用是10进制转16进制数据
//需要将16进制数还原处理来,将值转成16进制字符串,一字节等于两位的16进制数
stringBuilder.append(Integer.toHexString(tenSys));
}
}
//16进制转成10进制
//我的解析值不具备0x,parseInt默认是把10进制字符串转成integer,如果不是10进制需要指明
return Integer.parseInt(stringBuilder.toString(), 16);
}
文章来源:https://blog.csdn.net/weixin_43895362/article/details/135020047
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!