開發用到了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通信。