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 ,谁能帮我看看这是怎么回事吗?

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

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. 修正了输出内容错误的问题。

您的代码中,发送的数据是C903007300016599,但是返回的数据是C9 03 02 00 00 59 94。这个问题可能是由于您的代码中发送的数据格式不正确导致的。您可以尝试使用以下代码来发送数据:

byte[] data1 = new byte[]{(byte)0xC9, (byte)0x03, (byte)0x00, (byte)0x73, (byte)0x00, (byte)0x01, (byte)0x65, (byte)0x99};
outputStream.write(data1);
这个代码将发送C903007300016599这个16进制字符串。如果您仍然无法解决问题,建议您检查一下网络连接是否正常,或者检查一下其他日志文件以查找问题所在。

希望这可以帮到您!