LocalUDPDataSender.java 2.35 KB
package com.sunvote.udptest;

import java.net.DatagramSocket;
import java.net.InetAddress;

/**
 * Created by Elvis on 2017/8/8.
 * Email:Eluis@psunsky.com
 * Description:
 */

public class LocalUDPDataSender {

    private final static String TAG = LocalUDPDataSender.class.getSimpleName();

    private static LocalUDPDataSender instance = null;

    private DatagramSocket remoteUDPSocket = null;


    public static LocalUDPDataSender getInstance() {
        if (instance == null)
            instance = new LocalUDPDataSender();
        return instance;
    }

    private LocalUDPDataSender() {

    }

    public DatagramSocket resetRemoteUDPSocket() {
        try {
            closeLocalUDPSocket();
            remoteUDPSocket = (MainActivity.port ==  0 ?
                    new DatagramSocket() : new DatagramSocket(MainActivity.port));//_Utils.LOCAL_UDP_SEND$LISTENING_PORT);
            remoteUDPSocket.setReuseAddress(true);
            return remoteUDPSocket;
        } catch (Exception e) {
            closeLocalUDPSocket();
            return null;
        }
    }

    private boolean isRemoteUDPSocketReady() {
        boolean ret = true;
        if(remoteUDPSocket != null) {
            return ret && !remoteUDPSocket.isClosed();
        }
        return false;
    }



    public void closeLocalUDPSocket() {
        try {
            if (remoteUDPSocket != null) {
                remoteUDPSocket.close();
                remoteUDPSocket = null;
            } else {
            }
        } catch (Exception e) {
        }
    }

    public DatagramSocket getRemoteDPSocket() {
        if (isRemoteUDPSocketReady()) {
            return remoteUDPSocket;
        } else {
            return resetRemoteUDPSocket();
        }
    }



    /**
     * 需要重载一个函数
     * 如果没有指定服务器IP地址,则只能广播出去,让服务器接收处理
     * @param fullProtocalBytes
     * @param dataLen
     * @return
     */
    public int send(byte[] fullProtocalBytes, int dataLen) {
        DatagramSocket ds = getRemoteDPSocket();
        if (ds != null && !ds.isConnected()) {
            try {
                ds.connect(InetAddress.getByName(MainActivity.serverIp), MainActivity.port);
            } catch (Exception e) {
                return -1;
            }
        }
        return UDPUtils.send(ds, fullProtocalBytes, dataLen) ? 0 : -1;

    }


}