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

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

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值