长连接是否稳定,决定了消息能不能实时到达。本页把连接参数(心跳、空闲超时、退避、最大尝试)、状态机、三端实现与常见故障放在一起,便于按参数排查“为什么总是断线/重连很慢/消息延迟”。
import { createClient, Events } from '@ni-paas/im-web';
const client = createClient({ appkey: APPKEY, serverUrl: SERVER_URL });
client.addEventListener(Events.CONNECTING, (payload) => setStatus("连接中", payload));
client.addEventListener(Events.CONNECTED, (payload) => {
setStatus("已连接", payload);
flushSendQueue();
refreshConversations();
});
client.addEventListener(Events.SUSPEND, (payload) => {
setStatus("网络异常,自动重连中", payload);
pauseSending();
});
client.addEventListener(Events.DISCONNECT, (payload) => {
setStatus("连接断开", payload);
if (payload.code === 1002) reissueTokenThenReconnect();
});
client.addEventListener(Events.KICKED, () => {
showKickedDialog();
});
await client.connect(token);
client.addEventListener(IMClientEvent.CONNECTING, payload -> showConnecting(payload.getAttempt()));
client.addEventListener(IMClientEvent.CONNECTED, payload -> {
showConnected();
flushSendQueue();
});
client.addEventListener(IMClientEvent.SUSPEND, payload -> {
showReconnecting();
});
client.addEventListener(IMClientEvent.DISCONNECT, payload -> {
if (payload.getCode() == 1002) reissueTokenThenReconnect();
else showDisconnected(payload.getReason());
});
client.addEventListener(IMClientEvent.KICKED, payload -> showKickedDialog());
client.connect(token, new ConnectCallback() {
@Override public void onSuccess(String userId) { }
@Override public void onError(IMError error) {
showConnectFailed(error.getCode(), error.getMessage());
}
});
client.addEventListener(RongIMEvents.CONNECTING, (payload) => setState(() => status = "连接中"));
client.addEventListener(RongIMEvents.CONNECTED, (payload) async {
setState(() => status = "已连接");
await flushSendQueue();
});
client.addEventListener(RongIMEvents.SUSPEND, (payload) => setState(() => status = "自动重连中"));
client.addEventListener(RongIMEvents.DISCONNECT, (payload) {
if (payload.code == 1002) reissueTokenThenReconnect();
});
client.addEventListener(RongIMEvents.KICKED, (payload) => showKickedDialog());
final res = await client.connect(token);
if (res.code != 0) showConnectFailed(res.code, res.msg);