<>零、发现问题

* 用Java写了个UDP收发程序,发现中文有问题! package socket; import java.io.IOException; import
java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.
InetAddress; import java.net.SocketException; import java.net.
UnknownHostException; public class send { /** * 发送UDP数据 * @param args */ public
static void main(String[] args) { String str = "hello 这是一个JavaUDP实例!";
DatagramSocket socket= null; try { socket = new DatagramSocket();//创建数据包套接字
DatagramPacket packet= new DatagramPacket(str.getBytes(), str.length(),
InetAddress.getByName("127.0.0.1"), 7217);//构建数据包 socket.send(packet);//发送数据包
socket.close();//关闭套接字 } catch (SocketException e) { // TODO Auto-generated
catch block e.printStackTrace(); }catch (UnknownHostException e) { // TODO
Auto-generated catch block e.printStackTrace(); } catch (IOException e) { //
TODO Auto-generated catch block e.printStackTrace(); }finally { if(socket!=null)
{ socket.close();//关闭套接字 } } } } package socket; import java.io.IOException;
import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.
InetAddress; import java.net.SocketException; public class recive { static int
port= 7217;//监听的端口 /** * 接收UDP数据 * @param args */ public static void main(String
[] args) { DatagramSocket socket = null; try { socket = new DatagramSocket(port)
;//开始监听端口 DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
//创建缓存区 socket.receive(packet);//接收数据,这里阻塞 byte[] dataArray = packet.getData();
//获取收到的数据 int portSend = packet.getPort();//获取发送的端口 InetAddress address = packet
.getAddress();//获取发送的地址 int length = packet.getLength();//获取数据的长度 System.out.
println( "地址:"+address.getHostAddress() +"\n端口:"+portSend +"\n数据:\t" + "长度:"+
dataArray.length+"\n" + "\t内容:"+new String(dataArray,0,length));//显示内容 socket.
close();//关闭套接字 } catch (SocketException e) { // TODO Auto-generated catch block
e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch
block e.printStackTrace(); }finally { if(socket!=null) { socket.close();//关闭套接字
} } } }
<>一、显示不全

解决方法:把发送端的
DatagramPacket packet = new DatagramPacket(str.getBytes(), str.length(),
InetAddress.getByName("127.0.0.1"), 7217);//构建数据包
修改为
DatagramPacket packet = new DatagramPacket(str.getBytes(), str.length(),
InetAddress.getByName("127.0.0.1"), 7217);//构建数据包
总结:收发双方应统一使用
str.getBytes().length
获取长度

<>二、显示乱码

解决方法:使用统一编码
发送端的
DatagramPacket packet = new DatagramPacket(str.getBytes(), str.getBytes().
length, InetAddress.getByName("127.0.0.1"), 7217);//构建数据包
修改为
DatagramPacket packet = new DatagramPacket(str.getBytes(), str.getBytes("UTF-8"
).length, InetAddress.getByName("127.0.0.1"), 7217);//构建数据包
接收端的
System.out.println( "地址:"+address.getHostAddress() +"\n端口:"+portSend +"\n数据:\t"
+ "长度:"+dataArray.length+"\n" + "\t内容:"+new String(dataArray,0,length));//显示内容
修改为
System.out.println( "地址:"+address.getHostAddress() +"\n端口:"+portSend +"\n数据:\t"
+ "长度:"+dataArray.length+"\n" + "\t内容:"+new String(dataArray,0,length,"UTF-8"));
//显示内容
总结:收发双方String在跟Byte数组转换时应该指定编码

<>三、收到很多方块

在解决第二个问题的时候,出现过这种问题:

是因为一开始从Byte转到String时指定了编码没有指定长度
new String(dataArray,"UTF-8");
指定一下长度就可以了
new String(dataArray,0,length,"UTF-8");
<>四、总结

基本上乱码都是跟编码有关或者转换的时候收发双方处理不一致造成的。在以后的开发中需要注意!

技术
©2019-2020 Toolsou All rights reserved,
排序(一)冒泡排序法一文揭秘阿里、腾讯、百度的薪资职级大数据告诉你,中国女人有多累年薪20万属于什么水平?答案让人扎心!面试的时候突然遇到答不上的问题怎么办?SpringBoot实践(五):mybatis-plus中的BaseMapper,Iservice和ServiceImpl这些歌,程序员千万万万万别听!python中解决字典写入列表的问题中台透彻讲解GDOI2019 游记