今天重新温故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窗口看结果更为直观:
服务端接收:
很明显加了中文的字符串不全,赶紧找原因,肯定是接收的字节不对,要从客户端找原因,果然原因找到了。
在将字符串放入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);
果然修改完后就一切正常了(附上接收正常后的服务端图片):
总结:好了,问题解决了皆大欢喜。