【问题标题】:issue while receiving correct data from java client从java客户端接收正确数据时出现问题
【发布时间】:2016-02-23 13:43:19
【问题描述】:

我有一个 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 c# client-server


    【解决方案1】:

    您要确保也将字节解码为 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 字节长!

    一种解决方案可能是在发送数据之前发送数据的大小。如果您有兴趣,我在前一周向code review 询问过类似的内容!

    【讨论】:

    • 谢谢。但我使用了'Console.WriteLine(System.Text.Encoding.UTF8.GetString(buffer));'但我给了我一些“??”字符封闭框。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    • 1970-01-01
    • 2019-03-17
    相关资源
    最近更新 更多