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。旧版频繁切换时会出现无限 “连接-断开”的问题
- 添加网络权限
<!--申请权限-->
<uses-permission android:name="android.permission.INTERNET" />
- 如果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. 基本使用
- 简单介绍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); //解除监听器
- 上代码。
先把 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);
}
遇到的问题
- 明文传输
- 注意emit 第二个参数的格式,错误格式容易弄崩服务器,然后报:连接关闭、轮询错误、Caused by: java.io.IOException: 502 等等错误。(原谅我新手,这些错误没法一一解答,就把遇见的所有错误写这了)。
- 频繁访问,出现无限 “连接 - 断开 - 连接 -断开 …” 这样的问题,socket.io-android-chat 用的 0.8.3 版本,我换成 1.0.0 版本就没出现这个问题了。