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

从java客户端接收正确数据时出现问题,java,c#,client-server,Java,C#,Client Server,我有一个TCP客户机-服务器体系结构。服务器用C#编写,客户端用Java编写。 我想获取客户端设备的MAC地址。两者之间的连接正在工作。当我发送包含数据的数据包时,“IPMAC”被正确接收和解码。 但当我将MAC地址发送到服务器时,它会更改其中的数据 用于发送的Java代码: InetAddress ip; try { ip = InetAddress.getLocalHost(); NetworkInterface network

我有一个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");
        }
inet地址ip;
试一试{
ip=InetAddress.getLocalHost();
NetworkInterface网络=NetworkInterface.getByInetAddress(ip);
字节[]mac=network.getHardwareAddress();
StringBuilder sb=新的StringBuilder();
for(int i=0;i
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);
size=6;
字节[]缓冲区=新字节[6];
接收到的int=0;
ticks=Environment.TickCount;
做
{
尝试
{
if(Environment.TickCount>滴答声+超时)
抛出新的TimeoutException(“接收时超时!”);
received=received+client.client.received(缓冲区、已接收、大小-已接收、SocketFlags.None);
}
捕获(SocketException)
{
}
捕获(超时异常)
{
打破
}
如果(buffer.Length>1)
{
显示(“收到数据包!”,“哇”,MessageBoxButton.OK,MessageBoxImage.Information);
StringBuilder sb=新的StringBuilder();
for(int i=0;i
我在两侧使用UTF-8编码

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


谢谢

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


一种解决方案可能是在发送数据之前发送数据的大小。如果您感兴趣,我在前几周要求提供类似的解决方案!

谢谢。但我使用了“Console.WriteLine(System.Text.Encoding.UTF8.GetString(buffer));”但我在框中提供了一些“??”字符。