AndroidWebSocket实现即时通讯功能
最近做这个功能,分享⼀下。即时通讯(Instant Messaging)最重要的毫⽆疑问就是即时,不能有明显的延迟,要实现IM的功能其实并不难,⽬前有很多第三⽅,⽐如极光的JMessage,都⽐较容易实现。但是如果项⽬有特殊要求(如不能使⽤外⽹),那就得⾃⼰做了,所以我们需要使⽤WebSocket。
WebSocket
WebSocket协议就不细讲了,感兴趣的可以具体查阅资料,简⽽⾔之,它就是⼀个可以建⽴长连接的全双⼯(full-duplex)通信协议,允许服务器端主动发送信息给客户端。
Java-WebSocket框架
对于使⽤websocket协议,Android端已经有些成熟的框架了,在经过对⽐之后,我选择了Java-WebSocket这个开源框架,GitHub地址:,⽬前已经有五千以上star,并且还在更新维护中,所以本⽂将介绍如何利⽤此开源库实现⼀个稳定的即时通讯功能。
效果图
国际惯例,先上效果图
⽂章重点
1、与websocket建⽴长连接
2、与websocket进⾏即时通讯
3、Service和Activity之间通讯和UI更新
4、弹出消息通知(包括锁屏通知)
5、⼼跳检测和重连(保证websocket连接稳定性)
6、服务(Service)保活
⼀、引⼊Java-WebSocket
1、adle中加⼊
implementation "org.java-websocket:Java-WebSocket:1.4.0"
2、加⼊⽹络请求权限
<uses-permission android:name="android.permission.INTERNET" />
3、新建客户端类
新建⼀个客户端类并继承WebSocketClient,需要实现它的四个抽象⽅法和构造函数,如下:
public class JWebSocketClient extends WebSocketClient {
public JWebSocketClient(URI serverUri) {
super(serverUri, new Draft_6455());
}
@Override
public void onOpen(ServerHandshake handshakedata) {
Log.e("JWebSocketClient", "onOpen()");
}
@Override
public void onMessage(String message) {
Log.e("JWebSocketClient", "onMessage()");
}
@Override
public void onClose(int code, String reason, boolean remote) {
Log.e("JWebSocketClient", "onClose()");
}
@Override
public void onError(Exception ex) {
Log.e("JWebSocketClient", "onError()");
}
}
其中onOpen()⽅法在websocket连接开启时调⽤,onMessage()⽅法在接收到消息时调⽤,onClose()⽅法在连接断开时调
⽤,onError()⽅法在连接出错时调⽤。构造⽅法中的new Draft_6455()代表使⽤的协议版本,这⾥可以不写或者写成这样即可。
4、建⽴websocket连接
建⽴连接只需要初始化此客户端再调⽤连接⽅法,需要注意的是WebSocketClient对象是不能重复使⽤的,所以不能重复初始化,其他地⽅只能调⽤当前这个Client。
URI uri = ate("ws://*******");
JWebSocketClient client = new JWebSocketClient(uri) {
@Override
public void onMessage(String message) {
//message就是接收到的消息
Log.e("JWebSClientService", message);
}
};
为了⽅便对接收到的消息进⾏处理,可以在这重写onMessage()⽅法。初始化客户端时需要传⼊websocket地址(测试地址:
ws://),websocket协议地址⼤致是这样的
ws:// ip地址 : 端⼝号
连接时可以使⽤connect()⽅法或connectBlocking()⽅法,建议使⽤connectBlocking()⽅法,connectBlocking多出⼀个等待操作,会先连接再发送。
try {
} catch (InterruptedException e) {
e.printStackTrace();
}
运⾏之后可以看到客户端的onOpen()⽅法得到了执⾏,表⽰已经和websocket建⽴了连接
onOpen.png
5、发送消息
发送消息只需要调⽤send()⽅法,如下
if (client != null && client.isOpen()) {
client.send("你好");
}
6、关闭socket连接
关闭连接调⽤close()⽅法,最后为了避免重复实例化WebSocketClient对象,关闭时⼀定要将对象置空。
/**
* 断开连接
*/
private void closeConnect() {
try {
if (null != client) {
client.close();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
client = null;
}
}websocket和socket
⼆、后台运⾏
⼀般来说即时通讯功能都希望像QQ这些App⼀样能在后台保持运⾏,当然App保活这个问题本⾝就是个伪命题,我们只能尽可能保活,所以⾸先就是建⼀个Service,将websocket的逻辑放⼊服务中运⾏并尽可能保活,让websocket保持连接。
1、新建Service
新建⼀个Service,在启动Service时实例化WebSocketClient对象并建⽴连接,将上⾯的代码搬到服务⾥即可。
2、Service和Activity之间通讯
由于消息是在Service中接收,从Activity中发送,需要获取到Service中的WebSocketClient对象,所以需要进⾏服务和活动之间的通讯,这就需要⽤到Service中的onBind()⽅法了。
⾸先新建⼀个Binder类,让它继承⾃Binder,并在内部提供相应⽅法,然后在onBind()⽅法中返回这个类的实例。
public class JWebSocketClientService extends Service {
private URI uri;
public JWebSocketClient client;
private JWebSocketClientBinder mBinder = new JWebSocketClientBinder();
//⽤于Activity和service通讯
class JWebSocketClientBinder extends Binder {
public JWebSocketClientService getService() {
return JWebSocketClientService.this;
}
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论