安卓websocket 封装基于Java-websocket

Posted 임문이

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安卓websocket 封装基于Java-websocket相关的知识,希望对你有一定的参考价值。

本文借鉴于https://blog.csdn.net/u013872857/article/details/79190643感谢大神的贡献

借鉴文章所用websocket 第三方是:nv-websocket-client:2.2,

而这里所用的是:Java-WebSocket:1.3.0

核心代码如下:

public abstract class MyWebSocketService extends Service implements IWebSocket {

    private static final String TAG = MyWebSocketService.class.getSimpleName();
    private ServiceBinder binder = new ServiceBinder();

    private int connectStatus = 0;

    private WebSocketThread webSocketThread;
    private WebSocketClient client;


    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.i(TAG, "onBind: ");
        if (binder == null){
            binder = new MyWebSocketService.ServiceBinder();
        }
        return binder;
    }
    public class ServiceBinder extends Binder {
        public  MyWebSocketService getService() {
            return MyWebSocketService.this;
        }
    }


    @Override
    public void onCreate() {
        super.onCreate();
        Log.i(TAG, "onCreate: ");
        // 连接
        webSocketThread = new MyWebSocketService.WebSocketThread();
        webSocketThread.start();


    }
    private class WebSocketThread extends Thread {
        @Override
        public void run() {
            Log.i(TAG, "run: ");
            setupWebSocket();
        }
    }

    protected void setupWebSocket(){
        Log.i(TAG, "setupWebSocket: ");
        if (connectStatus != 0) return;
        connectStatus = 1;
        try {
            client = new WebSocketClient(URI.create(getConnectUrl()), new Draft_10()) {
                @Override
                public void onOpen(ServerHandshake handshakedata) {
                    connectStatus = 2;
                }

                @Override
                public void onMessage(String message) {
                    Log.i(TAG, "onMessage: " + message);
                    // 消息分发
                    dispatchResponse(message);
                }

                @Override
                public void onClose(int code, String reason, boolean remote) {
                    Log.e(TAG, "onClose: " + code + reason);
                    connectStatus = 0;
                    // EventBus 通知

                }

                @Override
                public void onError(Exception ex) {
                    Log.e(TAG, "onError: " + ex.getMessage());
                    connectStatus = 0;
                    // EventBus 通知
                }

            };
            client.connect();
        }catch (Exception e){
            e.printStackTrace();
        }

    }


    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.i(TAG, "onDestroy: ");
    }


    @Override
    public void sendText(String text) {
        Log.i(TAG, "sendText From Four Activity : " + text);
        if (TextUtils.isEmpty(text)) return;
        if (client != null && connectStatus == 2){
            client.send(text);
        }
    }

    @Override
    public int getConnectStatus() {
        return connectStatus;
    }

    @Override
    public void reconnect() {
        Log.i(TAG, "reconnect: ");
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if (webSocketThread != null && webSocketThread.isAlive()){
                    connectStatus = 0;
                    webSocketThread = new WebSocketThread();
                    webSocketThread.start();
                }else {
                    Log.e(TAG, "run: reconnect action is Failed " );
                }
            }
        }).start();
    }

    @Override
    public void stop() {
        Log.i(TAG, "stop: ");
        client.close();
        connectStatus = 0;
    }

    /**
     *  获取服务器地址
     * @return
     */
    protected abstract String getConnectUrl();


    /**
     * 分发响应数据
     */
    protected abstract void dispatchResponse(String textResponse);


}

同借鉴文章中 AbsBaseWebSocketService.java 文件

其主要功能是:

实现websocket 连接过程中几个行为:IWebSocket,

提供具体的服务绑定,

开启websocket 连接线程,回调消息处理等

其他代码不多加赘述,请先看借鉴文章,之后便对此一目了然,如有不懂,可在下方评论区留言,

谢谢!

 

以上是关于安卓websocket 封装基于Java-websocket的主要内容,如果未能解决你的问题,请参考以下文章

https://websocket 不连接安卓

WebSocket安卓客户端实现详解–服务端主动通知

基于django的webssh实现

手写一个 WebSocket 协议

Netty+MUI从零打造一个仿微信的高性能聊天项目,兼容iPhone/iPad/安卓

BeetleX实现MessagePack和Protobuf消息控制器调用websocket服务详解