Android开发——定位udp开发时反馈字符串出错问题

来源:互联网 发布:mac版latex使用教程 编辑:程序博客网 时间:2024/06/16 05:44

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);}}}}


	
				
		
原创粉丝点击