最近项目中用到长连接,使用的是Java-WebSocket,因此记录一下
GitHub地址:https://github.com/TooTallNate/Java-WebSocket
到GitHub中查看最新的版本,然后引用, 因此这里就不讲如何引用了,只讲用法:
public class SocketService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
WebSocketClient client;
@Override
public void onCreate() {
super.onCreate();
try {
client = new WebSocketClient(new URI("填入与后台连接的url")) {
@Override
public void onWebsocketPong(WebSocket conn, Framedata f) {
super.onWebsocketPong(conn, f);
// LogUtils.showLog(f.getPayloadData().toString());
// LogUtils.showLog("socket ping"+f.getOpcode());
}
@Override
public void onOpen(ServerHandshake serverHandshake) {
// 连接打开以后的回调
}
@Override
public void onMessage(String message) {
// 收到消息的回调
LogUtils.showLog("socket接收服务器发来的消息:" + message);
}
@Override
public void onError(Exception ex) {
// 连接出错的回调
}
@Override
public void onClose(int code, String reason, boolean remote) {
// 连接关闭的回调, remote如果为true表示被服务端cut掉了
}
@Override
public void onMessage(ByteBuffer bytes) {
// 返回的字节流消息
LogUtils.showLog("socket bytebuffer bytes");
}
};
client.connect();
} catch (Exception e) {
}
}
/**
* 重连websocket
* 此方法在handler中调用,由于重新连接websocket的线程如果与原先连接websocket的线程相同,会报异常,
* 所以切换到HandlerThread的线程中重连
*/
private void reConnectWebSocket() {
if (null != client && !client.isOpen() && !isReConnecting) {
//LogUtils.showLog("socket onStartConnect");
client.reconnect();
}
}
@Override
public void onDestroy() {
super.onDestroy();
try {
LogUtils.showLog("socket service onDestroy()");
client.close();
} catch (Exception e) {
}
}
}
1、重连机制需要自己来写:
(1)监听网络连接, 当从断开到连上就可以调用重连
(2)在client回调的onError和onClose中调用重连
2、心跳机制需要自己写
自己写一个循环的handler, 隔20秒就发送一个心跳:client.sendPing(), 这时候onWebsocketPong()会回调一次,这就是一次心跳
3、后端传回来的消息在onMessage中返回来, 我们可以跟后台定格式,哪些业务需要处理什么格式的数据,然后根据type来分发给业务。