在android studio下通过socket长连接实现推送

本文详细介绍了如何在Android Studio环境下,利用Socket通信技术建立并维护长连接,从而实现实时的消息推送功能。具体步骤包括设置客户端和服务端的Socket连接,保持连接稳定,以及处理数据传输等关键环节。
摘要由CSDN通过智能技术生成

实现代码

public class QpushClient implements Runnable {
protected static QpushClient mInstance;
protected Handler mHandler;
protected InetSocketAddress mAddress;
String mIMEI;
protected String TAG = "QpushClient";
//socket连接的超时时间
private final int CONNECT_TIME_OUT = 5 * 1000;
//巡检周期
private final int CHECK_PERIOD = 2 * 1000;
//连接尝试间隔时间
private final int CONNECT_PERIOD = 30 * 1000;
private final int HEARTBEART_PERIOD = 30 * 1000;
//若连接失败或响应失败,则尝试次数为9,若仍无效,则不再尝试
private final int CONNECT_TRY_TIMES = 9;

private final int SEND_MSG_TYPE_HEARTBEAT = 1; //心跳包
private final int SEND_MSG_TYPE_SOCKET_LOGIN = 2; //发送socket登录包
//连接尝试次数
private int mConnectCount;

Socket mClientSocket;
String mHost;
int mPort;
//设置是否去读取数据
boolean isStartRecieveMsg = false;
//开启心跳检测
boolean isKeepHeartBeat = false;

BufferedReader mReader;
ScheduledExecutorService executor;//定位定时器
HeartBeatTask mHeartBeatTask;

private QpushClient(Handler handler) {
    mHandler = handler;
}

public static QpushClient getInstance(Handler handler) {
    if (mInstance == null) {
        mInstance = new QpushClient(handler);
    }
    return mInstance;
}

public void init(String host, int port,String imei) {
    mHost = host;
    mPort = port;
    mIMEI = imei;
    new Thread(this).start();
    isStartRecieveMsg = true;
    isKeepHeartBeat = true;
}

@Override
public void run() {
    mAddress = new InetSocketAddress(getIP(mHost), mPort);

    //尝试连接,若未连接,则设置尝试次数
    while (mConnectCount < CONNECT_TRY_TIMES) {
        connect();
        if (!mClientSocket.isConnected()) {
            mConnectCount++;
            sleep(CONNECT_PERIOD);
        } else {
            mConnectCount = 0;//连接上,则恢复置0
            break;
        }
    }
    if (mClientSocket.isConnected()) {
        keepHeartBeat();
        recvProtobufMsg();
//            recvStringMsg();
    }
}

private void connect() {
    try {
        if (mClientSocket == null) {
            mClientSocket = new Socket();
        }
        mClientSocket.connect(mAddress, CONNECT_TIME_OUT);
        Driver.HeartBeat heartbeat = Driver.HeartBeat.newBuilder().setImei(mIMEI).build();
        Driver.ClientMessage socketLogin = Driver.ClientMessage.newBuilder().setType(1).setHeartBeat(heartbeat).build();
        sendMsg(socketLogin,SEND_MSG_TYPE_SOCKET_LOGIN);
    } catch (IOException e) {
        e.printStackTrace();
        Log.e(TAG, "连接失败 mClientSocket.connect fail ,ip=" + mAddress.getHostName() + ";port=" + mAddress.getPort() + ";detail:" + e.getMessage());
    }
}

/**
 * 心跳维护
 */
private void keepHeartBeat() {
    //设置心跳频率,启动心跳
    if (isKeepHeartBeat) {
        if (mHeartBeatTask == null) {
            mHeartBeatTask = new HeartBeatTask();
        }
        try {
            if (executor != null) {
                executor.shutdownNow();
                executor = null;
            }
            executor = Executors.newScheduledThreadPool(1);
            
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值