美文网首页
Android SocketClient使用实例

Android SocketClient使用实例

作者: 九月风666 | 来源:发表于2020-03-09 15:11 被阅读0次

    开发用到了socket通信,本来想用android自带的socket来实现,结果写的过程中遇到了各种问题(此处省略一把辛酸泪……)。后来在网上看到了别人写的SocketClient库,果断拿来用,最后跨过了不少坑终于实现了,这里记录一下,供大家参考。

    首先贴上SocketClient库的GitHub下载链接:https://github.com/vilyever/AndroidSocketClient

    首先下载下来并解压,这里着重提醒一下:一定不要下载GitHub上最新的库版本,因为新的版本第一是复杂,第二是原作者给整出了一些bug,导致onResponse一直不回调。后来我下载了一个老的版本(2.0.1),就没有上面的问题。

    解压完之后,就是把该库导入到你的android工程里。具体方法是,先把socketclient文件夹整个拷贝到你的android工程与app文件夹同级的目录下,拷贝完就是下面这样:

    image
    然后在settings.gradle里添加 ':socketclient',添加完如下:
    image
    接着在整个工程的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通信。

    您的赞赏是我坚持分享的最大动力 :)

    相关文章

      网友评论

          本文标题:Android SocketClient使用实例

          本文链接:https://www.haomeiwen.com/subject/qsjpdhtx.html