UdpPostSender.java 3.57 KB
package com.xgimi.gimicinema.service;

import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;

/**
 * UDP通信接口类,采用单例模式,用ip和通信端口初始化
 */
public class UdpPostSender extends Thread {

    protected static final int MSG_PARSE_DATA = 0x100;
    private static final String TAG = "UdpPostSender";

    private boolean isThreadDisable = false;// 指示监听线程是否终止
    private Handler mHandler;
    private DatagramSocket udpSocket = null;
    private DatagramPacket dataPacket = null;
    private InetAddress broadcastAddr = null;
    private int defaultPort;
    private int remotePort;
    private String ip;
    private String remoteIp;

    public UdpPostSender(String iP, int defaultPort, int remotePort,
                         Handler handler) {
        this.ip = iP;
        this.defaultPort = defaultPort;
        this.remotePort = remotePort;
        this.mHandler = handler;

        initData();

        if (handler != null) {// 不需要接收恢复信息的udp
            this.start();
        }
    }

    public String getRemoteIp() {
        return remoteIp;
    }

    @Override
    public void run() {
        startListen();
    }

    private void initData() {
        try {
            if (udpSocket == null) {
                udpSocket = new DatagramSocket(null);
                udpSocket.setReuseAddress(true);
                // udpSocket.setSoTimeout(5000);
                udpSocket.bind(new InetSocketAddress(defaultPort));
            }
            Log.i("info", "ip----" + ip);
            broadcastAddr = InetAddress.getByName(ip);

        } catch (Exception e) {
            Log.i("info", e.getMessage());
        }
    }

    public void sendUDPmsg(final String command) {
        byte out[] = command.getBytes();
        dataPacket = new DatagramPacket(out, out.length);
        dataPacket.setPort(remotePort);
        try {
            dataPacket.setAddress(InetAddress.getByName(remoteIp));
        } catch (UnknownHostException e) {
            Log.i("info", e.getMessage());
            e.printStackTrace();
        }
        Log.e(TAG, "cmd" + command + broadcastAddr.toString());
        new Thread() {
            public void run() {
                try {
                    udpSocket.send(dataPacket);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }

    public void startListen() {
        while (!isThreadDisable) {
            try {
                // 准备接收数据
                byte[] buf = new byte[4 * 1024];
                DatagramPacket packet = new DatagramPacket(buf, buf.length);
                initData();
//                udpSocket.setSoTimeout(2 * 1000);
                udpSocket.receive(packet);
//                String ip = packet.getAddress().getHostAddress();
                String cmd = new String(packet.getData(), 0, packet.getLength());
                if (!TextUtils.isEmpty(cmd)) {
                    remoteIp = packet.getAddress().toString().replace("/", "");
                }
                Message m = Message.obtain();
                m.what = MSG_PARSE_DATA;
                m.obj = cmd;
                mHandler.sendMessage(m);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public void stopListen() {
        isThreadDisable = true;
    }
}