Android SocketClient使用實例

開發用到了socket通信,本來想用android自帶的socket來實現,結果寫的過程中遇到了各種問題(此處省略一把辛酸淚……)。後來在網上看到了別人寫的SocketClient庫,果斷拿來用,最後跨過了不少坑終於實現了,這裏記錄一下,供大家參考。

首先貼上GitHub下載鏈接:點擊打開鏈接

https://github.com/vilyever/AndroidSocketClient

首先下載下來並解壓,這裏着重提醒一下:一定不要下載GitHub上最新的庫版本,因爲新的版本第一是複雜,第二是原作者給整出了一些bug,導致onResponse一直不回調。後來我下載了一個老的版本(2.0.1),就沒有上面的問題。

解壓完之後,就是把該庫導入到你的android工程裏。具體方法是,先把socketclient文件夾整個拷貝到你的android工程與app文件夾同級的目錄下,拷貝完就是下面這樣:

然後在settings.gradle裏添加 ':socketclient',添加完如下:


接着在整個工程的build.gradle裏添加如下配置:

buildscript和allprojects下添加:

maven { url "https://jitpack.io" }

dependencies下添加:

classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0"

然後還要在app下的build.gradle裏配置:

compile 'com.github.vilyever:AndroidSocketClient:2.0.1'

到這裏就算是基本導入完成了。接下來就可以直接用socketclient了。直接上代碼:

private SocketClient socketClient;
private SocketClientDelegate delegate;

//socket通信
private void startSocketClient(String info) throws IOException {
    String[] array = info.split("_");
    socketClient = new SocketClient();
    socketClient.getAddress().setRemoteIP(array[0]);//設置IP,這裏設置的是本地IP
    socketClient.getAddress().setRemotePort(Integer.parseInt(array[1]));//設置端口
    socketClient.getAddress().setConnectionTimeout(15 * 1000);//設置超時時間


    socketClient.setCharsetName(CharsetUtil.UTF_8);//設置編碼格式,默認爲UTF-8
    socketClient.connect(); // 連接,異步進行

    //常用回調配置
    // 對應removeSocketClientDelegate
    socketClient.registerSocketClientDelegate(delegate = new SocketClientDelegate() {
        /**
         * 連接上遠程端時的回調
         */
        @Override
        public void onConnected(SocketClient client) {
            Log.d("melog", "gamesocket連接成功");
            launcher.callExternalInterface("gameSocketConnectSuccess", "success");
        }

        /**
         * 與遠程端斷開連接時的回調
         */
        @Override
        public void onDisconnected(SocketClient client) {
            Log.d("melog", "gamesocket連接斷開");
            // 可在此實現自動重連
            // socketClient.connect();
            launcher.callExternalInterface("socketClose", "close");
        }

        /**
         * 接收到數據包時的回調
         */
        @Override
        public void onResponse(SocketClient client, @NonNull SocketResponsePacket responsePacket) {

            String message = responsePacket.getMessage(); // 獲取按默認設置的編碼轉化的String,可能爲null
            launcher.callExternalInterface("socketDataHandler", message);
        }
    });
}

//發送消息
private void socketSendMessage(String info) {
    String status = String.valueOf(socketClient.getState());
    if (socketClient != null && status == "Connected") {
        socketClient.sendData(info.getBytes()); // 發送byte[]消息
    }
}

//前臺請求gamesocket連接狀態
private void requestGameSocketConnectFlg() {
    String status = String.valueOf(socketClient.getState());
    launcher.callExternalInterface("gameSocketFlg", status);
}

//前臺主動斷開gamesocket
private void closeGameSocket() {
    if (socketClient != null) {
        socketClient.removeSocketClientDelegate(delegate);
        socketClient.disconnect();
    }
}

代碼就很簡單了,相信大家看註釋就能明白了,如果有哪裏不太明白,可以仔細閱讀下github上的詳細說明。但是那個說明是按照最新版本講解的,跟老版本差別還是很大的,比如設置讀取策略socketClient.getSocketPacketHelper().setReadStrategy(); 這個在老版本就沒有。

好了,希望大家也都能成功實現socket通信。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章