编辑代码

import java.io.*;
import java.net.*;
import java.util.Arrays;

public class EnhancedHexClient {
    // 协议常量
    private static final byte START_MARKER = (byte) 0xAA;
    private static final byte END_MARKER = (byte) 0xAA;

    // 十六进制转换工具
    private static class HexConverter {
        private static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray();

        public static byte[] hexToBytes(String hex) {
            hex = hex.replaceAll("\\s", "").toUpperCase();
            if (hex.length() % 2 != 0) {
                throw new IllegalArgumentException("Invalid hex string");
            }
            byte[] bytes = new byte[hex.length() / 2];
            for (int i = 0; i < bytes.length; i++) {
                int high = Character.digit(hex.charAt(i*2), 16) << 4;
                int low = Character.digit(hex.charAt(i*2+1), 16);
                bytes[i] = (byte) (high + low);
            }
            return bytes;
        }

        public static String bytesToHex(byte[] bytes) {
            char[] hexChars = new char[bytes.length * 2];
            for (int j = 0; j < bytes.length; j++) {
                int v = bytes[j] & 0xFF;
                hexChars[j * 2] = HEX_ARRAY[v >>> 4];
                hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F];
            }
            return new String(hexChars);
        }
    }

    // 校验和计算
    private static byte calculateChecksum(byte[] data) {
        byte checksum = 0;
        for (byte b : data) {
            checksum ^= b;
        }
        return checksum;
    }

    public static void main(String[] args) {
        String serverAddress = "8.130.77.20";
        int serverPort = 8080;
        
        // 原始数据内容(不包含协议头尾和校验)
        String dataContent = "0104087781800500000005591D1002";
        
        try (Socket socket = new Socket(serverAddress, serverPort);
             OutputStream out = socket.getOutputStream();
             InputStream in = socket.getInputStream()) {

            // 1. 构造数据包
            byte[] dataBytes = HexConverter.hexToBytes(dataContent);
            
            // 2. 生成长度字段(大端序)
            int dataLength = dataBytes.length;
            byte[] lengthBytes = new byte[] {
                (byte) ((dataLength >> 8) & 0xFF), // 高位在前
                (byte) (dataLength & 0xFF)
            };
            
            // 3. 计算校验和
            byte checksum = calculateChecksum(dataBytes);
            
            // 4. 组装完整数据包
            ByteArrayOutputStream packet = new ByteArrayOutputStream();
            packet.write(START_MARKER);       // 起始符
            packet.write(lengthBytes);        // 长度字段
            packet.write(dataBytes);          // 数据内容
            packet.write(checksum);           // 校验和
            packet.write(END_MARKER);         // 结束符
            byte[] fullPacket = packet.toByteArray();
            
            // 5. 发送数据
            out.write(fullPacket);
            out.flush();
            System.out.println("Sent full packet: " + HexConverter.bytesToHex(fullPacket));

            // 6. 接收响应(实现同理)
            // ... 接收处理逻辑 ...