使用场景:需要和硬件保持实时通信
为什么用websocket:在以前的消息推送机制中,用的都是http轮询(polling),做一个定时器定时向服务器发送请求,这种方式是非常消耗资源的,因为它本质还是http请求,而且显得非常笨拙。而WebSocket 在浏览器和服务器完成一个握手的动作,在建立连接之后,服务器可以主动传送数据给客户端,客户端也可以随时向服务器发送数据。
1.引入java-websocket
implementation 'org.java-websocket:Java-WebSocket:1.4.0'
2.初始化连接
/**
* 初始化websocket连接
*/
private void initSocketClient() {
URI uri = URI.create(WSUri);
client = new JWebSocketClient(uri) {
//可以获取到一些服务器推送过来的消息
@Override
public void onMessage(String message) {
JSONObject jsonObject = JSON.parseObject(message);
}
@Override
public void onOpen(ServerHandshake handshakedata) {
super.onOpen(handshakedata);
Log.e("JWebSocketClientService", "websocket连接成功");
msgData sn = new msgData();
sn.setSn(getDeviceSN());
msg obj = new msg();
obj.setCommand("init");
obj.setData(sn);
String str = JSON.toJSONString(obj);
Log.e(TAG, "-----" + JSON.toJSONString(obj));
sendMsg(str);
heartBeatRunnable.run();
}
@Override
public void onError(Exception ex) {
super.onError(ex);
Log.e(TAG, "websocket连接错误:" + ex);
}
@Override
public void onClose(int code, String reason, boolean remote) {
super.onClose(code, reason, remote);
Log.e(TAG, "websocket断开连接:·code:" + code + "·reason:" + reason + "·remote:" + remote);
}
};
connect();
}
3.连接websocket
先判断是否已经连接过了,连接过了什么也不做
/**
* 连接websocket
*/
private void connect() {
if (client.isOpen()) {
return;
}
client.connect();
}
4.发送消息
我们可以自定义一些消息(msg)发送给服务器
/**
* 发送消息
*
* @param msg
*/
public void sendMsg(String msg) {
if (null != client) {
client.send(msg);
}
}
5.重连
由于很多因素甚至是外部因素的影响,可能会导致我们建立的ws连接会断连这个时候我们需要重新连接上服务器文章来源:https://www.toymoban.com/news/detail-816934.html
/**
* 开启重连
*/
private void reconnectWs() {
Log.e("", "正在重连");
initSocketClient();
}
6.心跳检测
心跳检测是判断有没有断连的重要方法,也能比较严谨的让后台判断硬件的在线状态,通过判断client的状态来决定是否重新建立连接,如下代码,如果判断不是关闭状态,我会发送一些信息给服务器,里边包括硬件的sn编号和一个“ping”的字符串,来告诉后台这台设备还“活着”。文章来源地址https://www.toymoban.com/news/detail-816934.html
private static final long HEART_BEAT_RATE = 15 * 1000;//每隔15秒进行一次对长连接的心跳检测
private Handler mHandler = new Handler();
//心跳检测
private Runnable heartBeatRunnable = new Runnable() {
@Override
public void run() {
mHandler.removeCallbacks(heartBeatRunnable);
if (client != null) {
if (client.isClosed()) {
Log.e(TAG, "关闭状态");
reconnectWs();//心跳机制发现断开开启重连
} else {
//发送消息
msgData sn = new msgData();
sn.setSn(getDeviceSN());
msg obj = new msg();
obj.setData(sn);
if (client.isOpen()) {
obj.setCommand("ping");
Log.e("", "❤");
sendMsg(JSON.toJSONString(obj));
} else {
Log.e(TAG, "异常");
reconnectWs();//心跳机制发现断开开启重连
}
}
} else {
Log.e("", "没有初始化");
//如果client已为空,重新初始化连接
initSocketClient();
}
mHandler.postDelayed(heartBeatRunnable, HEART_BEAT_RATE);
}
};
到了这里,关于Android程序中使用websocket通信(java-websocket)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!