基于Android端与服务端的UDP通信工具

   ## 客户端与服务端基于UDP的通信工具 ## 
   转眼从学习安卓开发到工作已经一年的多了,以前都是遇到问题就在网上各种搜索代码结局额问题,可以说是踩过了很多巨人的肩膀了,从中也学习到了很多。
    最近由于项目需要用UDP与服务器交互,该开始听到项目要使用这个协议时也是一头雾水,因为之前也没怎么在项目中接触过,所以在网上搜索了良久,最终根据综合了一些大神的代码和理解写了自己的一个基于UDP的与服务器交互的工具类,希望能让后来着少走点弯路吧。
    因为与服务器交互收发数据是是个耗时过程,所以需要在子线程里面处理这些信息。

/**
* UDP模式发送数据到服务器
*/

public class UdpSendData extends Thread{
    private static final int TIME_OUT = 3000; //设置超时为3秒
    private static final int MAXTRIES = 5; //最大重发次数为5次
    private static final String URL = ""; //URL地址
    private static final int PORT = ; //服务器端口号
    private String string;
    private static final String TAG = "UdpSendData";
    private String result;
    private MyCallback callback;

    public UdpSendData(String str ,MyCallback callback) {
        string = str;
        this.callback = callback;
    }

    @Override
    public void run() {

        byte[] data = string.getBytes();
        try {
            InetAddress address = InetAddress.getByName(URL);
            DatagramSocket socket = new DatagramSocket(1985);
            //打包发送信息
            DatagramPacket sendPacket = new DatagramPacket(data, data.length, address, PORT);
            //初始化一个空的接收包大小
            byte dataSize[] = new byte[4 * 1024];
            DatagramPacket receivePacket = new DatagramPacket(dataSize, dataSize.length);
            int tries = 0; //超时重传
            boolean receiveResponse = false;
            do {
                socket.send(sendPacket); //发送信息
                socket.setSoTimeout(TIME_OUT);
                try {
                    socket.receive(receivePacket); //接收信息
                    receiveResponse = true;
                    result = new String(receivePacket.getData(),receivePacket.getOffset(),receivePacket.getLength());
                    callback.success(result);
                    if (!receivePacket.getAddress().equals(address)) {
                        throw new IOException("收到一个未知源的数据包");
                    }

                } catch (InterruptedIOException e) {
                    //当服务器接收不到信息或者接收信息超过3秒时,就向服务器重发请求
                    tries += 1;
                }
            } while ((!receiveResponse) && (tries <MAXTRIES));
            socket.close();

        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (SocketException e) {
            e.pr          e.printStackTrace();
        }

    }
}
       而且接收消息也是属于耗时操作,所以我们需要当请求发送成

/*
*自定义回掉监听接口
*/

public interface MyCallback {
    public void success(String result);
}

/**
*使用
*/


    JsonObject params = new JsonObject();
        params.addProperty("time", 2016);
        String string = params.toString();
        UdpSendData udpSendData = new UdpSendData(string, new MyCallback() {
            @Override
            public void success(String result) {
                if (result.length() > 0) {
                //更新UI到主线程
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(MainActivity.this, "成功退出", Toast.LENGTH_SHORT).show();
                        }
                    });
                }
            }
        });
        new Thread(udpSendData).start();

初次写博客,可能很多问题,希望对一些新手会有用处。最后加一句,这个功能因为是在联网状态下,所以配置文件里面得开启网络权限;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值