java udp通信中文乱码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java udp通信中文乱码相关的知识,希望对你有一定的参考价值。

用java编写的udp网络通信程序,在本机连接测试中没有乱码,在和其他pc机通信时就出现中文乱码(本机是ubuntu系统,其他测试机是win)。听说好像是编码问题,但具体要怎么解决呢?

java记住不要使用 xxxx.getBytes()
一定要使用 xxxx.getBytes("UTF-8") 或者 xxxx.getBytes("GBK")
解析时也要 new String(byte[] , "UTF-8")
参考技术A 发和收,两个都流,都按UTF-8编码 。。。。。。

Java:可以发送和接收 UDP 数据包,但接收到的数据是乱码

【中文标题】Java:可以发送和接收 UDP 数据包,但接收到的数据是乱码【英文标题】:Java: Can send and receive UDP-packets, but received data is gibberish 【发布时间】:2019-11-20 17:40:15 【问题描述】:

编辑:已解决(见评论)

我正在尝试编写一个非常基本的程序/系统,其中一个程序发送 UDP 数据包,其中包含一个带有单词 iwas 和一位数的字符串,例如“iwas2”。第二个程序应该接收数据包(然后将其内容写入向量)。 发送程序似乎工作正常,但接收程序却没有那么多。当我启动接收程序时,它会在发送程序启动/开始发送时立即收到一个数据包(并且没有收到一个包/之前将其他东西误解为一个包),但接收到的内容不匹配发送的内容或对我有任何意义。例如。发送者发送“iwas1”,接收者理解“[B@6a2bcfcb”。 (根据wireshark的说法,发送数据包的数据部分确实是“iwas1”,长度为5个字节,所以这似乎不是问题。)

//code of sender-programm
import java.io.IOException;
import java.net.*;
import java.util.Random;
import java.util.concurrent.TimeUnit;

public class umgebung 
    public static void main(String[] args) throws IOException, InterruptedException 


        //try 
            //byte[] buffer = new byte[65508];
            //InetAddress address = InetAddress.getByName("jenkov.com");

            //DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, 9000);

            //Integer inteins = new Integer(5);
            Random zahlgen = new Random();
            int aktwetter = 0;              //initialisieurng
        DatagramSocket socketeins = new DatagramSocket(90);


            while (0 != 1) 
                /*      
                int neugenentscheidungszahl = zahlgen.nextInt() % 10;
                if (neugenentscheidungszahl > 8)                           
                    aktwetter = zahlgen.nextInt() % 4;      
                
                */
                aktwetter = ++aktwetter % 4;        
                System.out.printf(aktwetter + "\n");



                String stringeins = new String("iwas" + aktwetter);
                ;
                byte[] buffer = stringeins.getBytes();
                //InetAddress empfangsip;
                //empfangsip = InetAddress.getByName("127.0.0.1");

                DatagramPacket paketeins = new DatagramPacket(buffer, buffer.length, InetAddress.getByName("127.0.0.1"), 50);       //senden an port 50
                //DatagramSocket socketeins = new DatagramSocket(90);
                socketeins.send(paketeins);

                TimeUnit.SECONDS.sleep(1);
            
        //
        /*
        catch(IOException | InterruptedException e)
            //e.printStackTrace();
            System.out.printf("verkackt");
        
        */
    

.

//code of receiver-programm  
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.ByteBuffer;

public class empfaenger 
    public static void main(String[] args) throws IOException 
        InetAddress empfangadresse = InetAddress.getByName("127.0.0.1");
        DatagramSocket socketeins = new DatagramSocket(50, empfangadresse);


        byte[] empfangbytearray = new byte[65000];                        
        DatagramPacket empfangpaket = new DatagramPacket(empfangbytearray, empfangbytearray.length);
        socketeins.receive(empfangpaket);


        String teststring = new String(empfangpaket.getData().toString());
        System.out.println("bla" + teststring + "bla");
    

我认为问题很可能是我如何处理/解释接收到的字节,但不知道具体在哪里。感谢您的帮助。

【问题讨论】:

它现在可以工作,因为我更改了“String teststring = new String(empfangpaket.getData().toString());” to "String teststring = new String(empfangbytearray, 0, empfangpaket.getLength());" 【参考方案1】:

在线String teststring = new String(empfangpaket.getData().toString());

改成

String teststring = new String(empfangpaket.getData());

您正在打印 Byte[].toString() 的结果,而不是您期望的结果。

【讨论】:

以上是关于java udp通信中文乱码的主要内容,如果未能解决你的问题,请参考以下文章

关于socket UDP通信,接收到乱码的问题!!急急急!SOS!

Java:可以发送和接收 UDP 数据包,但接收到的数据是乱码

linux用java socket与c的socket通信乱码问题

解决Qt Tcp通信传输中文字符乱码问题

windows环境下Mysql中文乱码问题解决方法

java socket 网络通信返回文本转码问题 java socket 网络通信返回文本是乱码,怎么转为GBK?