概述
1. 概述
有时候在开发中,我们会有一些需求是需要建立长连接的,比如自己项目中的付款码,需要商家用扫码枪来扫二维码,必须等商家扫完二维码收完款时然后发消息给客户端,这个时候就需要让客户端与服务器端建立长连接,达到让客户端与服务器端保持连接,直到收完款然后客户端自行断开连接,同时服务器端也需要在操作成功时候断开连接。
2. 具体实现
1>:添加对okhttp的依赖:
compile 'com.squareup.okhttp3:okhttp:3.8.1'
2>:连接websocket:
/**
* Author : 马占柱
* E-mail : mazhanzhu_3351@163.com
* Time : 2021/4/10 16:56
* Desc : Socket长连接
*/
public class WebSocketManager extends WebSocketListener {
public static final String Action_Socket = "com.driving.driver.android.base.WebSocketManager.MZX";
public final String TAG = "WebSocketManager";
private final int NORMAL_CLOSURE_STATUS = 1000;
private OkHttpClient sClient = null;
private WebSocket sWebSocket = null;
private String mSocketURL;
private int neworder = 0;
private final int ACTION_EMPTYMSG = 1400;
private final int ACTION_FAILURE = 1401;
private final int ACTION_MUSIC = 1402;
private Handler handler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case ACTION_EMPTYMSG:
HashMap<String, Object> map2 = Http_Date.getMap();
map2.put("heart", "");
sendData(new Gson().toJson(map2));
// 每隔5秒发送一次心跳包,检测连接没有断开
handler.sendEmptyMessageDelayed(ACTION_EMPTYMSG, 5000);
break;
case ACTION_FAILURE:
connectWebSocket();
handler.sendEmptyMessageDelayed(ACTION_FAILURE, 5000);
break;
default:
break;
}
}
};
private void stopMusic() {
neworder = 0;
handler.removeMessages(ACTION_MUSIC);
}
private WebSocketManager() {
}
private static volatile WebSocketManager instance;
public static WebSocketManager getInstance() {
if (instance == null) {
synchronized (WebSocketManager.class) {
if (instance == null) {
instance = new WebSocketManager();
}
}
}
return instance;
}
public void connectWebSocket() {
String mSocket = MMKV.defaultMMKV().decodeString(Constant.SOCKET, "");
if (!Http_Date_Utils.getUserID().equals("")) {
if (!TextUtils.isEmpty(mSocket)) {
if (sClient == null) {
sClient = new OkHttpClient.Builder()
.readTimeout(45, TimeUnit.SECONDS)//设置读取超时时间
.writeTimeout(45, TimeUnit.SECONDS)//设置写的超时时间
.connectTimeout(45, TimeUnit.SECONDS)//设置连接超时时间
.build();
}
if (sWebSocket == null) {
mSocketURL = "ws://" + mSocket;
Request request = new Request.Builder().url(mSocketURL).build();
sWebSocket = sClient.newWebSocket(request, this);
}
}
}
}
public void sendData(String info) {
if (sWebSocket != null) {
Log_Ma.e(TAG, mSocketURL + ",数据:" + info);
if (!TextUtils.isEmpty(info)) {
sWebSocket.send(info);
}
}
}
@Override
public void onMessage(WebSocket webSocket, String text) {
if (!TextUtils.isEmpty(text)) {
onGetMsg(text);
}
}
@Override
public void onMessage(WebSocket webSocket, ByteString bytes) {
if (!TextUtils.isEmpty(bytes.hex())) {
onGetMsg(bytes.hex());
}
}
@Override
public void onClosing(WebSocket webSocket, int code, String reason) {
Log_Ma.e(TAG, "onClosing() called with: code = [" + code + "], reason = [" + reason + "]");
webSocket.close(NORMAL_CLOSURE_STATUS, null);
}
@Override
public void onClosed(WebSocket webSocket, int code, String reason) {
Log_Ma.e(TAG, "onClosed() called with: code = [" + code + "], reason = [" + reason + "]");
}
@Override
public void onFailure(WebSocket webSocket, Throwable t, Response response) {
Log_Ma.e(TAG, "Socket连接失败!!!----------------" + mSocketURL + "-------------连接失败!!!");
if (sWebSocket != null) {
sWebSocket.close(NORMAL_CLOSURE_STATUS, "Goodbye!");
sWebSocket = null;
}
handler.removeMessages(ACTION_EMPTYMSG);
handler.sendEmptyMessage(ACTION_FAILURE);
EventBusData event = new EventBusData();
event.setSocketType(EventBusUtils.Order_OnFailure);
EventBus.getDefault().post(event);
}
@Override
public void onOpen(WebSocket webSocket, Response response) {
Log_Ma.e(TAG, "Socket连接成功!!!----------------" + mSocketURL + "-------------连接成功!!!");
String userID = Http_Date_Utils.getUserID();
HashMap<String, Object> map1 = Http_Date.getMap();
map1.put("loginid", userID);
sendData(new Gson().toJson(map1));
handler.removeMessages(ACTION_FAILURE);
handler.sendEmptyMessage(ACTION_EMPTYMSG);
}
public void closeWebSocket() {
if (sWebSocket != null) {
sWebSocket.close(NORMAL_CLOSURE_STATUS, "Goodbye!");
sWebSocket = null;
}
if (sClient != null) {
sClient = null;
}
if (instance != null) {
instance = null;
}
handler.removeCallbacksAndMessages(null);
}
public void onGetMsg(String json) {
Log_Ma.e(TAG, "接收Socket消息:" + json);
}
}
最后
以上就是含糊小蝴蝶为你收集整理的使用okhttp的websocket实现长连接【直接使用】的全部内容,希望文章能够帮你解决使用okhttp的websocket实现长连接【直接使用】所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复