如果你开发中遇到需要使用长连接的地方,尤其是需要使用到websocket,我们一般都是使用Android-websocket,或者使用okhttp进行链接。不过在众多选择中我比较倾向于使用socketio。socketio最直观的特点就是消息的分类,通过不通的消息分类使得消息的管理更加便捷,这里我简单对SocketIo在Android上的使用做一下说明,服务端的小伙伴请自行寻找其他资料学习。
1.首先,我们需要引入相关的socket.io的开发依赖
implementation 'io.socket:socket.io-client:1.0.0'
2.接着我们为项目添加网络权限
<uses-permission android:name="android.permission.INTERNET"/>
3.接着我们创建socket.io链接
创建Socket对象
private Socket mSocket;
接着初始化mSocket
try {
IO.Options opts = new IO.Options();
opts.query = "loginUserNum=" + 78;
mSocket = IO.socket("http://192.168.0.162:9099", opts);//这里的地址我们用后台提供的
} catch (URISyntaxException e) {
e.printStackTrace();
}
这里的opts是建立链接时后台接收的一个识别,用于识别是哪个客户端和后台建立的长连接
4.开始链接
mSocket.connect();
5.链接成功回调监听
mSocket.on("connect", new Emitter.Listener() {
@Override
public void call(Object... args) {
runOnUiThread(new Runnable() {
@Override
public void run() {
tv_lj.setText("链接成功");
}
});
}
});
这里的回调是子线程,所以要注意如果需要更改UI,必须转入主线程中进行更改。
6.消息接收回调监听
mSocket.on("text", new Emitter.Listener() {
@Override
public void call(final Object... args) {
runOnUiThread(new Runnable() {
@Override
public void run() {
tv_content.setText(args[0].toString());
}
});
}
});
7.消息发送
mSocket.emit("text","终于发过去了");
8.链接销毁
最后不要忘记销毁掉链接
@Override
public void onDestroy() {
super.onDestroy();
mSocket.off();
mSocket.disconnect();
}
9.网络配置
此时你发现依然无法连接成功,不要着急,我们需要加入一个配置
在res下创建xml包,并创建 network_security_config.xml,代码如下
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
然后在清单文件,即AndroidManifest.xml中application节点下配置
android:networkSecurityConfig="@xml/network_security_config"
到此我们Socket.io的链接就完成了。 我们可以使用这一套代码实现自主的IM即时通讯,心跳建立等。
我们Socket.io的每一条消息都可以给它指定消息的类型,保证我们建立多个socket.io的回调监听不同的消息,实现消息分类。同时Socket.io还支持多平台的接入,能后实现多个平台使用一套框架的目的。