从 Java 客户端接收正确数据时出现问题

本文关键字:数据 问题 客户 Java 客户端 端接 | 更新日期: 2023-09-27 18:35:54

我有一个TCP客户端-服务器架构。服务器是用C#编写的,客户端是用Java编写的。我想获取客户端设备的MAC地址。两者之间的连接正在工作。当我发送带有数据"IPMAC"的数据包时,它会正确接收和解码。但是当我将 MAC 地址发送到服务器时,它会更改其中的数据。

用于发送的 Java 代码:

InetAddress ip;
        try {
            ip = InetAddress.getLocalHost();
            NetworkInterface network = NetworkInterface.getByInetAddress(ip);
            byte[] mac = network.getHardwareAddress();
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < mac.length; i++) {
                sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : ""));        
            }
            outStream.write(sb.toString().getBytes("UTF-8"));
            System.out.println("Data sent " + sb.toString());
        } catch (IOException e) {
            System.out.println("Unable to get MAC address of device or send it to server");
        }

用于接收的 C# 代码:

size = 6;
        byte[] buffer = new byte[6];
        int received = 0;
        ticks = Environment.TickCount;
        do
        {
            try
            {
                if (Environment.TickCount > ticks + timeout)
                    throw new TimeoutException("Timout while receiving!");
                received = received + client.Client.Receive(buffer, received, size - received, SocketFlags.None);
            }
            catch (SocketException)
            {
            }
            catch (TimeoutException)
            {
                break;
            }
            if (buffer.Length > 1)
            {
                MessageBox.Show("Packet received!", "Wow", MessageBoxButton.OK, MessageBoxImage.Information);
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < buffer.Length; i++)
                {
                    sb.Append(String.Format("%02X%s", buffer[i], (i < buffer.Length - 1) ? "-" : ""));
                }
                Console.WriteLine(BitConverter.ToString(buffer));
                break;
            }
        }
        while (received < size);

我在两端都使用 UTF-8 编码。

发送的 MAC 地址: 00-08-BA-11-00
收到的 MAC 地址: A1-21-00-00-00

谢谢

从 Java 客户端接收正确数据时出现问题

您要确保将字节解码为 UTF-8

Console.WriteLine(System.Text.Encoding.UTF8.GetString(buffer));

在 java 中,您可以获取表示整数的字节byte[] mac并对其执行字符串格式String.format("%02X%s"... 。你获取这个字符串,把它转换成字节,然后通过套接字发送。在 C# 端收到的字节表示 UTF-8 字符,而不是整数,因此不要尝试再次设置字符串格式。删除 C# 客户端上的StringBuilder,只需将字节解码为 utf8 字符串,如上所示。

另外,为什么选择要size = 6;的接收字节大小?如果数据超过 6 字节怎么办?utf8 中"00-08-BA-11-00"的字符串长度为 14 个字节!

一种解决方案可能是在发送数据之前发送数据的大小。如果您有兴趣,我要求在前一周对类似的东西进行代码审查!