折燕 2023-05-06 11:37 采纳率: 82.1%
浏览 83
已结题

Java实现TCP通信

我和TCP进行通信,发送出去指令后返回来的数据不对


public static void main(String[] args) {
        SpringApplication.run(VersolApplication.class, args);
        try {

            // 建立TCP连接
            Socket socket = new Socket("150455.cnsh.iot-tcp.com", 15000);

            // 获取输入输出流
            InputStream inputStream = socket.getInputStream();
            OutputStream outputStream = socket.getOutputStream();

            // 发送数据
            //16进制转byte
            byte[] data1 = Hex2Bytes("C903007300016599");
            //byte[] data = new byte[]{data1};
            outputStream.write(data1);

            // 接收数据
            byte[] buffer = new byte[1024];
            int len = inputStream.read(buffer);
            byte[] response = new byte[len];
            //byte转16进制
            String string = byte2HexWithBlank(new byte[len]);
            System.out.println("string: " + data1);
            System.arraycopy(buffer, 0, response, 0, len);

            // 处理返回数据
            System.out.println("Received: " + string);
           
            // 关闭连接
            socket.close();
     
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

控制台输出

img


这个结果明显不对,我用串口调试工具返回的是C9 03 02 00 00 59 94 ,谁能帮我看看这是怎么回事吗?

  • 写回答

2条回答 默认 最新

  • 卑以自牧w 2023-05-06 13:51
    关注

    接收数据的方式可能存在问题

    byte[] buffer = new byte[1024];
    int len = inputStream.read(buffer);
    byte[] response = new byte[len];
    String string = byte2HexWithBlank(new byte[len]);
    System.out.println("Received: " + string);
    System.arraycopy(buffer, 0, response, 0, len);
    

    这里使用了 inputStream.read(buffer) 方法来接收数据,并将接收的数据存放在了 buffer 数组中,然后使用 byte2HexWithBlank 方法将字节数组转换为了字符串并输出。这种方式可能存在问题,因为 inputStream.read(buffer) 方法并不能保证一次性将所有数据都读取完毕,可能会出现读取不完整的情况,因此需要根据实际情况进行调整。另外,在输出之前,应该先将 response 数组中的数据转换为字符串,而不是直接输出 string 变量。
    修改后的代码:

    public static void main(String[] args) {
        SpringApplication.run(VersolApplication.class, args);
        try {
            // 建立TCP连接
            Socket socket = new Socket("150455.cnsh.iot-tcp.com", 15000);
            // 获取输入输出流
            InputStream inputStream = socket.getInputStream();
            OutputStream outputStream = socket.getOutputStream();
            // 发送数据
            byte[] data = Hex2Bytes("C903007300016599");
            outputStream.write(data);
            // 接收数据
            byte[] buffer = new byte[1024];
            int len = 0;
            while ((len = inputStream.read(buffer)) != -1) {
                byte[] response = new byte[len];
                System.arraycopy(buffer, 0, response, 0, len);
                // 处理返回数据
                String string = byte2HexWithBlank(response);
                System.out.println("Received: " + string);
            }
            // 关闭连接
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    

    主要的修改包括:

    1. 利用循环读取数据,确保读取完整;
    2. 将接收到的数据转换为字符串,并输出;
    3. 修正了输出内容错误的问题。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 5月10日
  • 已采纳回答 5月10日
  • 创建了问题 5月6日