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;
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容