问题描述:
模拟UDP聊天,当接收到发送方发过来的信息是bye的时候,结束listen里的循环。
但是这么写的话,发送方发过来"bye",listen方法if("bye".equals(receiveMsg))
判断结果为false。
public void listen() throws IOException {
DatagramSocket datagramSocket = new DatagramSocket(listenPort);
byte[] bytes = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(bytes,0,bytes.length);
while (true){
datagramSocket.receive(datagramPacket);
byte[] data = datagramPacket.getData();
String receiveMsg =new String(data, 0, data.length);
System.out.println(receiveMsg);
System.out.println("bye".equals(receiveMsg));
if("bye".equals(receiveMsg)){
break;
}
}
datagramSocket.close();
System.out.println(Thread.currentThread().getName()+"end");
}
bye
false
原因分析:
String receiveMsg =new String(data, 0, data.length);
这行代码的第3个参数送错了,在发送端输入"bye"时:data.length
值为1024,datagramPacket.getLength()
值为3,所以在用String receiveMsg =new String(data, 0, data.length);
生成String时,实际上生成的是一个长度维1024的String,自然与长度为3的"bye"不相等。
byte[] bytes = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(bytes,0,bytes.length);
byte[] data = datagramPacket.getData();
System.out.println("data.length:"+data.length);//1024
System.out.println("datagramPacket.getLength():"+datagramPacket.getLength());//3
解决方案:
方案一:
String receiveMsg =new String(data, 0, data.length);
第三个参数改为datagramPacket.getLength()
public void listen() throws IOException {
DatagramSocket datagramSocket = new DatagramSocket(listenPort);
byte[] bytes = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(bytes,0,bytes.length);
while (true){
datagramSocket.receive(datagramPacket);
byte[] data = datagramPacket.getData();
//改法一
//String receiveMsg =new String(data, 0, data.length);
String receiveMsg =new String(data, 0, datagramPacket.getLength());
System.out.println(receiveMsg);
System.out.println("bye".equals(receiveMsg));
if("bye".equals(receiveMsg)){
break;
}
}
datagramSocket.close();
System.out.println(Thread.currentThread().getName()+"end");
}
方案二:
if("bye".equals(receiveMsg))
比较时先将receiveMsg去空格:
public void listen() throws IOException {
DatagramSocket datagramSocket = new DatagramSocket(listenPort);
byte[] bytes = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(bytes,0,bytes.length);
while (true){
datagramSocket.receive(datagramPacket);
byte[] data = datagramPacket.getData();
String receiveMsg =new String(data, 0, data.length);
System.out.println(receiveMsg);
System.out.println("bye".equals(receiveMsg));
//该法二:
//if("bye".equals(receiveMsg)){
if("bye".equals(receiveMsg.trim())){
break;
}
}
datagramSocket.close();
System.out.println(Thread.currentThread().getName()+"end");
}