Android UDP通讯(简单demo)

本章节 比较简单
直接上code了
首先创建一个UDP class 构造方法如下
通过newFixedThreadPool 创建一个线程池

public UdpSocket(Context mContent) {
        this.mContent = mContent;
        int cpuNumbers = Runtime.getRuntime().availableProcessors();
        // 根据CPU数目初始化线程池
        mThreadPool = Executors.newFixedThreadPool(cpuNumbers * POOL_SIZE);
        // 记录创建对象时的时间
    }

然后
一个startUdp scoket 重要步骤

public void startUDPSocket() {
        if (client != null) return;
        try {
            client = new DatagramSocket(CLIENT_PORT);
            if (receivePacket == null) {
                // 创建接受数据的 packet
                receivePacket = new DatagramPacket(receiveByte, BUFFER_LENGTH);
            }
            startSocketThread();
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

startSocketThread是一个 接收消息的子线程
内部是一个接收消息的循环
BROADCAST_IP 是通信对方的地址

    private void startSocketThread() {
        clientThread = new Thread(new Runnable() {
            @Override
            public void run() {
                printMessage("clientThread is running...");
                receiveMessage();
            }
        });
        isThreadRunning = true;
        clientThread.start();
    }

    private void receiveMessage() {
        while (isThreadRunning) {
            try {
                if (client != null) {
                    client.receive(receivePacket);
                }
                printMessage("message success...");
            } catch (IOException e) {
                Log.e(TAG, "UDP数据包接收失败!stopUDPSocket");
                stopUDPSocket();
                e.printStackTrace();
                return;
            }

            if (receivePacket == null || receivePacket.getLength() == 0) {
                Log.e(TAG, "无法接收UDP数据或者接收到的UDP数据为空");
                continue;
            }

            String strReceive = new String(receivePacket.getData(), 0, receivePacket.getLength());
            printMessage(" data:  " + strReceive + " from " + receivePacket.getAddress().getHostAddress() + ":" + receivePacket.getPort());

            //解析接收到的 json 信息

            // 每次接收完UDP数据后,重置长度。否则可能会导致下次收到数据包被截断。
            if (receivePacket != null) {
                receivePacket.setLength(BUFFER_LENGTH);
            }
        }
    }

利用广播 把接收到的消息打印到前台

    public void printMessage(String s) {
        Log.d(TAG, s);
        Intent intent = new Intent();
        intent.setAction(MainActivity.REFRESH_ACTION);
        intent.putExtra("Message", s);
        mContent.sendBroadcast(intent);
    }

再然后创建一个发送message的方法

public void sendMessage(final byte[] message) {
        mThreadPool.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    DatagramPacket sendPacket = new DatagramPacket(message, message.length,
                            InetAddress.getByName(BROADCAST_IP), CLIENT_PORT);
                    client.send(sendPacket);

                    // 数据发送事件
                    printMessage("数据发送成功");

                } catch (UnknownHostException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        });
    }

文章所有code 地址---> github
https://github.com/hanjole/Udpscoket_demo

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 10,066评论 1 29
  • 简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者...
    JasonShi6306421阅读 983评论 0 1
  • error code(错误代码)=0是操作成功完成。error code(错误代码)=1是功能错误。error c...
    Heikki_阅读 2,422评论 1 9
  • 本文出自 Eddy Wiki ,转载请注明出处:http://eddy.wiki/interview-java.h...
    eddy_wiki阅读 1,378评论 0 14
  • Android开发艺术探索 第二章IPC机制 Linux中IPC通信方式?答:命名管道,共享内存,信号量(具体再细...
    方木Rudy阅读 774评论 0 2
  • 某天,群里有个mm跟我们介绍梦想具化的奇妙。她举例说她的一个离异的朋友,为她的下一任伴侣列了200多条的清单,结果...
    信时光阅读 113评论 0 0
  • 今天是我坚持在霸占舞台打卡学习的103天。继续周末阅读名人传记《乔布斯传》。 乔布斯有着传奇的一生,他曾经分享过,...
    周杨英阅读 433评论 0 1
  • 今晚刷了第二遍《蜘蛛侠 平行宇宙》,还是没有特别的感觉,声光电刺激过猛,失去了心里的感知力。 然后觉得自己够做作的...
    快乐的玲欣阅读 324评论 0 2