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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。