关于#java#的问题:UDP传送数据出现中文乱码应该怎么解决

UDP传送到数据出现中文乱码应该怎么解决
发送端

package UDP;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner;

public class SenderB {
    public static void main(String[] args) throws IOException {
        DatagramSocket datagramSocket = new DatagramSocket(8888);
        Scanner scanner = new Scanner(System.in);
        String q=scanner.next();
        DatagramPacket datagramPacket = new DatagramPacket(q.getBytes(), q.length(), InetAddress.getLocalHost(),9998);
        datagramSocket.send(datagramPacket);

        byte[] buf=new byte[1024];
        DatagramPacket packet = new DatagramPacket(buf,buf.length);
        datagramSocket.receive(packet);
        String Date=new String(packet.getData(),0,packet.getLength());
        System.out.println(Date);
        datagramSocket.close();
    }
}

接受端

package UDP;

import java.io.IOException;
import java.net.*;

public class ReceiverA {
    public static void main(String[] args) throws IOException {
        DatagramSocket datagramSocket = new DatagramSocket(9998);
        byte[] bytes=new byte[1024];
        DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
        datagramSocket.receive(datagramPacket);
        String s=new String(datagramPacket.getData(),0,datagramPacket.getLength());
        System.out.println("接收到:"+s);
        String str=null;
        if(s.equals("四大名著是哪些")) str="四大名著就是四大名著啊";
        else str="听不懂你说啥";
        DatagramPacket datagramPacket1 = new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getLocalHost(), 8888);
        datagramSocket.send(datagramPacket1);

        datagramSocket.close();
    }
}

发送端

img


接收端

img

基于Monster 组和GPT的调写:

在发送端的代码中,你可以将以下行:

DatagramPacket datagramPacket = new DatagramPacket(q.getBytes(), q.length(), InetAddress.getLocalHost(), 9998);

修改为:

DatagramPacket datagramPacket = new DatagramPacket(q.getBytes("UTF-8"), q.getBytes("UTF-8").length, InetAddress.getLocalHost(), 9998);

这样可以将字符串 q 转换为指定的字符编码方式(如UTF-8)的字节数组。

在接收端的代码中,你可以将以下行:

String s = new String(datagramPacket.getData(), 0, datagramPacket.getLength());

修改为:

String s = new String(datagramPacket.getData(), 0, datagramPacket.getLength(), "UTF-8");

这样可以使用指定的字符编码方式(如UTF-8)来解析接收到的字节数组,并转换为正确的字符串。

通过在发送端和接收端都使用相同的字符编码方式,你应该能够解决中文乱码的问题。

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/1018016
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:关于java中UDP接收端与发送端的写法
  • 除此之外, 这篇博客: Java网络通信Part1:网络基础知识及通信协议中的 ★ UDP协议 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 用户数据报协议(User Datagram Protocol)
    无连接通信协议 即在数据传输时 和接收端不建立逻辑连接

    消耗耗资小 通信效率高 通常用于音频 视频和普通数据的传输
    即使丢失一两个数据报 也不会对接收结果产生太大影响

    由于UDP协议的面向无连接性 无法保证数据的完整性
    在传输重要数据时不建议使用UDP协议

    发送的数据被限制在64kb之内 超出则无法发送
    在这里插入图片描述


  • 以下回答由chatgpt基于相关博客总结生成:

    UDP传输中出现中文乱码的问题可以通过设置正确的字符集进行解决。具体方案如下:

    1.发送方设置编码格式:将要传输的中文字符串按照指定的编码格式转换成字节数组,然后发送。示例代码如下:

    String str = "中文";
    byte[] bytes = str.getBytes("UTF-8"); // 将字符串转换为UTF-8格式的字节数组
    DatagramPacket packet = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("接收方IP"), 接收方端口号);
    datagramSocket.send(packet); // 发送数据包
    

    2.接收方设置解码格式:接收到字节数组后,将其按照指定的编码格式转换为中文字符串。示例代码如下:

    byte[] bytes = new byte[1024];
    DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
    datagramSocket.receive(packet); // 接收数据包
    String str = new String(bytes, 0, packet.getLength(), "UTF-8"); // 将字节数组转换为中文字符串
    System.out.println(str); // 输出中文字符串
    

    设置正确的编码格式即可避免中文乱码问题。此外,还需要注意字符集是否一致,避免发送方和接收方使用不同的编码格式导致乱码问题。