UDP中文接收出现乱码问题结局

今天重新温故UDP的时候出了一个小BUG,中文传输后收到的是乱码想了一下,其实是中文字符与英文字符所占字节问题。

上代码:

客户端代码:

public class ScoketSend {  
    public static void main(String[] args) throws Exception {  
        Scanner sc = new Scanner(System.in);  
        DatagramSocket datagramSocket = new DatagramSocket();  
        //方便一直发送数据,最好做一个判断使得datagramSocket关闭,在这就不加了。  
        while(true){  
            String line = sc.nextLine();  
            DatagramPacket datagramPacket = new DatagramPacket(line.getBytes(), line.length(), InetAddress.getByName("127.0.0.1"), 6666);  
            datagramSocket.send(datagramPacket);  
        }  
    }  
}  
服务端代码:

public class SocketReciver {  
    public static void main(String[] args) throws Exception {  
        DatagramSocket datagramSocket = new DatagramSocket(6666);  
        //方便一直接受数据,同样最好做一个判断使得dataSocket关闭,可以是客户端传一个"quit"字符串来判断关闭   
 	while(true){  
            DatagramPacket datagramPacket = new DatagramPacket(new byte[1024], 1024);  
            datagramSocket.receive(datagramPacket);  
            byte[] arr = datagramPacket.getData();  
            int len = datagramPacket.getLength();  
            System.out.println(new String(arr,0,len));  
        }  
    }  
}  

通过dos窗口看结果更为直观:

UDP中文接收出现乱码问题结局_第1张图片

服务端接收:

UDP中文接收出现乱码问题结局_第2张图片

很明显加了中文的字符串不全,赶紧找原因,肯定是接收的字节不对,要从客户端找原因,果然原因找到了。

在将字符串放入packet的时候,我给的是字符串的长度,用字节流传输应该是给字节数组大小。

错误代码:

new DatagramPacket(line.getBytes(), line.length(), InetAddress.getByName("127.0.0.1"), 6666);  
修改后的代码:
new DatagramPacket(line.getBytes(), line.getBytes().length, InetAddress.getByName("127.0.0.1"), 6666);
果然修改完后就一切正常了(附上接收正常后的服务端图片):

总结:好了,问题解决了皆大欢喜。

你可能感兴趣的:(java学习遇到的问题)