Android开发——定位udp开发时反馈字符串出错问题
设计了一个客户端用upd传递数据的开关switch,服务器接收udp包后获取其中字符串,然后把这个字符串反馈给客户端。
【问题现象】:开关开时传送turn on the light 1,接到反馈相同没有问题;关闭时传送turn off the light 1,也接收到正常反馈,没有问题;但是在次打开开关时,反馈的却是turn on the light 11最后多了一个1。
【问题分析】:开始时怀疑负责显示的组件没有清空原来的字符串,但是后来排除了,发现接收的反馈字符串本身有问题。
排查服务器程序的时候,发现负责接收udp包中的字节数组的byte[] bt是在while循环之前定义的,while循环每一次接收到udp包时,都是把其中的byte[]写到bt中,这种写法可能不是清空后写,而是从前往后覆盖bt中的字节单元,覆盖不到的就会保留在bt中这样导致原来残留的‘1’还存在。
【问题解决】:把byte[] bt放到while监听循环中。这样可以解决这个问题,但是不断new出新的对象会导致内存浪费,虽然java有内存回收机制,但是不知道效果可不可靠。
说起来容易,定位起来还是不容易的啊,花了将近一个小时时间。
package com.leo; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class SimpleSever { public static void main(String[] args) throws IOException { DatagramSocket ds = new DatagramSocket(30000); while (true) { //下面两行本来在循环外,就是这样出错的,现已改正 byte[] byt = new byte[100]; DatagramPacket packet = new DatagramPacket(byt, byt.length); ds.receive(packet); //要收的信息已经放在byt中了,下面想怎么处理自己决定 System.out.println(byt.toString()); System.out.println(new String(packet.getData(), 0, packet.getLength())); for (int i = 0; i < 2; i++) { //反馈一下收到了,没收到就不用反馈了正常状态就是没收到 //反馈两次是防止已经打开电器但是手机没有收到反馈二再操作一次 //手机只要收到一次反馈就不用抛异常,如果超时就要抛异常 byte[] byt2 = "This is a reaction.".getBytes(); DatagramPacket packet2 = new DatagramPacket(byt, byt.length, // InetAddress.getByName("127.0.0.1"), InetAddress.getByName("192.168.1.108"), packet.getPort()); ds.send(packet2); } } } }