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阅读 11,161评论 1 32
  • 简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者...
    JasonShi6306421阅读 1,267评论 0 1
  • error code(错误代码)=0是操作成功完成。error code(错误代码)=1是功能错误。error c...
    Heikki_阅读 3,462评论 1 9
  • 本文出自 Eddy Wiki ,转载请注明出处:http://eddy.wiki/interview-java.h...
    eddy_wiki阅读 2,252评论 0 14
  • Android开发艺术探索 第二章IPC机制 Linux中IPC通信方式?答:命名管道,共享内存,信号量(具体再细...
    方木Rudy阅读 1,139评论 0 2