1. 依赖包引用,在build.gradle里加入这个依赖
注意:如果引用版本过低的话,没有断线重连的功能,我目前用的是这个版本
implementation "org.java-websocket:Java-WebSocket:1.5.1"
2. 新建一个工具类 WebSocketUtil
这里是把ws做成的单例模式,方便在不同的地方调用
public class WebSocketUtil {
public static WebSocketClient webSocketClient = null;
public static Context s_context;
private static TaskListener listener;
public static WebSocketClient inistance(Context context){
if(webSocketClient == null){
init();
}
s_context = context;
return webSocketClient;
}
public static void addListener(TaskListener taskListener){
listener = taskListener;
}
private static void init(){
URI serverURI = URI.create(Constants.WebSocket_URL);
webSocketClient = new WebSocketClient(serverURI) {
@Override
public void onOpen(ServerHandshake handshakedata) {
App.log( "WebSocket已连接=============================");
}
@Override
public void onMessage(String message) {
App.log( "收到服务器消息:" + message);
}
@Override
public void onClose(int code, String reason, boolean remote) {
App.log( "WebSocket已关闭");
}
@Override
public void onError(Exception ex) {
App.log( "服务器状态:" + ex.toString());
}
};
}
// 这个是我自己业务逻辑去验证链接合法性的
private static void auth(String client_id){
String deviceKey = App.getSharedPreferences().getString(Sp.DeviceKey, "");
RequestUtil.AuthClient(deviceKey, client_id, new BaseListener() {
@Override
public void suc(Object suc) {
Util.showLargeLog(TAG, suc + "", 4000);
}
@Override
public void err(Object err) {
App.log( "err: " + err);
}
});
}
}
3. 在入口类中初始化Websocket,同时用Timer来监听
每10秒检查一次当前ws的连接状态,如果不是连接中的话判定为断开,同时发起重连
@Override
public void onCreate() {
super.onCreate();
application = this;
context = getApplicationContext();
// 初始化Websocket
WebSocketUtil.inistance(context).connect();
// 写一个Timer,来保证ws保持连接
keepWebSocketConnect();
}
public void keepWebSocketConnect(){
if (timer == null) {
timer = new Timer();
}
timer.schedule(new TimerTask() {
@Override
public void run() {
if( ! WebSocketUtil.inistance(context).getReadyState().equals(ReadyState.OPEN)){
App.log( "守护进程判定ws已关闭,尝试重连");
WebSocketUtil.inistance(context).reconnect();
}
}
}, 0, 10 * 1000);
}
4. 写一个监听类,用来监听ws服务端传来的消息,并且随意映射到当前的Activity
public interface TaskListener {
String SYSTEM_UPDATE = "SYSTEM_UPDATE";
String SYSTEM_REBOOT = "SYSTEM_REBOOT";
String MEET_REFRESH = "MEET_REFRESH";
String DEBUG = "debug";
void task_message(String TaskName, String param);
}
5. 在你想要接收ws通信的页面Activity里,加入这个监听器,并重写监听方法即可。
这里的Taskname之类的参数是你和服务端那边统一约定就行,没有什么限制
public class MainActivity extends AppCompatActivity implements TaskListener {
@Override
public void task_message(String TaskName, String param) {
App.log("接收到TASK指令,TaskName:" + TaskName + ", param:" + param);
// 这里的Taskname和服务端那边约定好类型就可以了,没有什么限制的,然后匹配到对应的操作
switch (TaskName) {
case TaskListener.SYSTEM_UPDATE:
SystemHelper.wakeUpAndUnlock(this);
runOnUiThread(() -> SystemHelper.update(MainActivity.this, param));
break;
case TaskListener.SYSTEM_REBOOT:
SystemHelper.wakeUpAndUnlock(this);
SpeechHelper.speech(this, "系统即将重启");
break;
case TaskListener.MEET_REFRESH:
SystemHelper.wakeUpAndUnlock(this);
SpeechHelper.speech(this, "收到下发资料");
break;
case TaskListener.DEBUG:
SystemHelper.wakeUpAndUnlock(this);
SpeechHelper.speech(this, "收到服务器指令");
new Thread(()
-> runOnUiThread(()
-> Toast.makeText(MainActivity.this, "交互指令:" + param, Toast.LENGTH_SHORT).show()
)).start();
break;
default:
SystemHelper.wakeUpAndUnlock(this);
SpeechHelper.speech(this, "无效命令");
break;
}
}
}