Android10 嵌入Websocket客户端

1. 依赖包引用,在build.gradle里加入这个依赖

注意:如果引用版本过低的话,没有断线重连的功能,我目前用的是这个版本
    implementation "org.java-websocket:Java-WebSocket:1.5.1"

2. 新建一个工具类 WebSocketUtil

这里是把ws做成的单例模式,方便在不同的地方调用
public class WebSocketUtil {
    public static WebSocketClient webSocketClient = null;
    public static Context s_context;
    private static TaskListener listener;

    public static WebSocketClient inistance(Context context){
        if(webSocketClient == null){
            init();
        }

        s_context = context;
        return webSocketClient;
    }

    public static void addListener(TaskListener taskListener){
        listener = taskListener;
    }

    private static void init(){
        URI serverURI = URI.create(Constants.WebSocket_URL);

        webSocketClient = new WebSocketClient(serverURI) {
            @Override
            public void onOpen(ServerHandshake handshakedata) {
                App.log( "WebSocket已连接=============================");
            }

            @Override
            public void onMessage(String message) {
                App.log( "收到服务器消息:" + message);
            }

            @Override
            public void onClose(int code, String reason, boolean remote) {
                App.log( "WebSocket已关闭");
            }

            @Override
            public void onError(Exception ex) {
                App.log( "服务器状态:" + ex.toString());
            }
        };
    }

    // 这个是我自己业务逻辑去验证链接合法性的
    private static void auth(String client_id){
        String deviceKey = App.getSharedPreferences().getString(Sp.DeviceKey, "");

        RequestUtil.AuthClient(deviceKey, client_id, new BaseListener() {
            @Override
            public void suc(Object suc) {
                Util.showLargeLog(TAG, suc + "", 4000);
            }

            @Override
            public void err(Object err) {
                App.log( "err: " + err);
            }
        });
    }
}

3. 在入口类中初始化Websocket,同时用Timer来监听

每10秒检查一次当前ws的连接状态,如果不是连接中的话判定为断开,同时发起重连
    @Override
    public void onCreate() {
        super.onCreate();
        application = this;
        context = getApplicationContext();
        
        // 初始化Websocket
        WebSocketUtil.inistance(context).connect();

        // 写一个Timer,来保证ws保持连接
        keepWebSocketConnect();
    }

    public void keepWebSocketConnect(){
        if (timer == null) {
            timer = new Timer();
        }
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                if( ! WebSocketUtil.inistance(context).getReadyState().equals(ReadyState.OPEN)){
                    App.log( "守护进程判定ws已关闭,尝试重连");
                    WebSocketUtil.inistance(context).reconnect();
                }
            }
        }, 0, 10 * 1000);
    }

4. 写一个监听类,用来监听ws服务端传来的消息,并且随意映射到当前的Activity

public interface TaskListener {
    String SYSTEM_UPDATE = "SYSTEM_UPDATE";
    String SYSTEM_REBOOT = "SYSTEM_REBOOT";
    String MEET_REFRESH = "MEET_REFRESH";
    String DEBUG = "debug";

    void task_message(String TaskName, String param);
}

5. 在你想要接收ws通信的页面Activity里,加入这个监听器,并重写监听方法即可。

这里的Taskname之类的参数是你和服务端那边统一约定就行,没有什么限制
public class MainActivity extends AppCompatActivity implements TaskListener {

    @Override
    public void task_message(String TaskName, String param) {
        App.log("接收到TASK指令,TaskName:" + TaskName + ", param:" + param);

        // 这里的Taskname和服务端那边约定好类型就可以了,没有什么限制的,然后匹配到对应的操作
        switch (TaskName) {
            case TaskListener.SYSTEM_UPDATE:
                SystemHelper.wakeUpAndUnlock(this);
                runOnUiThread(() -> SystemHelper.update(MainActivity.this, param));
                break;
            case TaskListener.SYSTEM_REBOOT:
                SystemHelper.wakeUpAndUnlock(this);
                SpeechHelper.speech(this, "系统即将重启");
                break;
            case TaskListener.MEET_REFRESH:
                SystemHelper.wakeUpAndUnlock(this);
                SpeechHelper.speech(this, "收到下发资料");
                break;
            case TaskListener.DEBUG:
                SystemHelper.wakeUpAndUnlock(this);
                SpeechHelper.speech(this, "收到服务器指令");
                new Thread(()
                        -> runOnUiThread(()
                        -> Toast.makeText(MainActivity.this, "交互指令:" + param, Toast.LENGTH_SHORT).show()
                )).start();
                break;
            default:
                SystemHelper.wakeUpAndUnlock(this);
                SpeechHelper.speech(this, "无效命令");
                break;
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容