Android——Socket.IO

本文详细介绍在Android应用中集成Socket.IO的步骤,包括配置、初始化、基本使用及常见问题解决,适用于实时通信应用开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:Android端例子&&使用方法

1. 配置

  1. 引入gradle,Sync Now.
	implementation ('io.socket:socket.io-client:1.0.0') {
        exclude group: 'org.json', module: 'json'
    }

2019/11/14 记录: 新版为1.0.0,上面官网demo0.8.3。旧版频繁切换时会出现无限 “连接-断开”的问题

  1. 添加网络权限
    <!--申请权限-->
    <uses-permission android:name="android.permission.INTERNET" />
  1. 如果http协议,在AndroidManifest.xml里设置明文传输,不然会报错。
	android:usesCleartextTraffic="true"

2. 初始化Socket.io

注意导包时,别导成import java.net.Socket;要用import io.socket.client.Socket;

方法①: 直接在使用时初始化

import io.socket.client.IO;
import io.socket.client.Socket;

		Socket mSocket;
		try {
            mSocket = IO.socket(BaseURL.BASE_URL);
        } catch (URISyntaxException e) {
            throw new RuntimeException(e);
        }

方法②: 自定义XXApplication里初始化.
AndroidManifest.xml:android:name=".XXApplication"

public class MyApplication extends Application {

    private Socket mSocket;
    {
        try {
            mSocket = IO.socket(BaseURL.BASE_URL);
        } catch (URISyntaxException e) {
            throw new RuntimeException(e);
        }
    }

    public Socket getSocket() {
        return mSocket;
    }
}

使用

	XXApplication application = (XXApplication) getApplication();
    mSocket = application.getSocket();

方法③: 单例模式初始化

3. 基本使用

  1. 简单介绍Socket.IO如何使用。
 		mSocket.on(String  event, Emitter.Listener fn); //on监听消息
 		mSocket.connect(); //connect连接
 		mSocket.emit(String  event,Object ... args); //emit用于发送消息 
 		mSocket.disconnect(); //断开连接
 		mSocket.off(String  event, Emitter.Listener fn); //解除监听器
 		
  1. 上代码。
    先把 socket.io-android-chat 里的部分代码拷到自己的项目, 主要是CONNECT、DISCONNECT、CONNECT_ERROT和CONNECT_TIMEOUT这四个事件。然后仿照这四个事件,添加自己的其它事件就OK啦。
	private Boolean isConnected = false;

	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //初始化Socket
		XXApplication application = (XXApplication) getApplication();
        mSocket = application.getSocket();
        //添加监听事件
		mSocket.on(Socket.EVENT_CONNECT, onConnect);
        mSocket.on(Socket.EVENT_DISCONNECT, onDisconnect);
        mSocket.on(Socket.EVENT_CONNECT_ERROR, onConnectError); //建议加上,方便查看错误。打印错误日志在下面的onConnectError监听里
        mSocket.on(Socket.EVENT_CONNECT_TIMEOUT, onConnectError);//同上
        //添加自己的监听事件,例如:
        mSocket.on("NewMessage",onNewMessage); //onNewMessage仿照其它监听事件,也可直接在这new Emitter.Listener()
        
        mSocket.connect();
    }
    
    private Emitter.Listener onConnect = new Emitter.Listener() {
        @Override
        public void call(Object... args) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    // TODO: 2019/11/14  code...
                }
            });
        }
    };

    private Emitter.Listener onDisconnect = new Emitter.Listener() {
        @Override
        public void call(Object... args) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Log.i(TAG, "diconnected");
                    isConnected = false;
                }
            });
        }
    };

    private Emitter.Listener onConnectError = new Emitter.Listener() {
        @Override
        public void call(final Object... args) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                	//连接失败时输出错误
                    for (int i = 0; i < args.length; i++) {
                        if (args[i] instanceof Throwable) {
                            ((Throwable) args[i]).printStackTrace();
                        }
                    }
                }
            });
        }
    };
    @Override
    protected void onDestroy() {
        super.onDestroy();

        mSocket.disconnect();
        mSocket.off(Socket.EVENT_CONNECT, onConnect);
        mSocket.off(Socket.EVENT_DISCONNECT, onDisconnect);
        mSocket.off(Socket.EVENT_CONNECT_ERROR, onConnectError);
        mSocket.off(Socket.EVENT_CONNECT_TIMEOUT, onConnectError);
        mSocket.off("UnreadMessage", onUnreadMessage);
        mSocket.off("NewMessage", onNewMessage);
    }     

遇到的问题

  1. 明文传输
  2. 注意emit 第二个参数的格式,错误格式容易弄崩服务器,然后报:连接关闭、轮询错误、Caused by: java.io.IOException: 502 等等错误。(原谅我新手,这些错误没法一一解答,就把遇见的所有错误写这了)。
  3. 频繁访问,出现无限 “连接 - 断开 - 连接 -断开 …” 这样的问题,socket.io-android-chat 用的 0.8.3 版本,我换成 1.0.0 版本就没出现这个问题了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值