1.首先需要在AndroidManifest.xml中開啟一個服務:
<!-- 后臺服務-長連接 -->
<service android:name=".service.BackService" />
2.添加參考
implementation 'com.squareup.okhttp3:okhttp:3.12.1'
3.寫一個類BackService繼承Service:
public class BackService extends Service{
@Override
public void onCreate() {
super.onCreate();
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
4.在BackService的onCreate()方法中開啟一個執行緒:
@Override
public void onCreate() {
super.onCreate();
new InitSocketThread().start();
}
class InitSocketThread extends Thread {
@Override
public void run() {
super.run();
try {
initSocket();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 心跳檢測時間
*/
private static final long HEART_BEAT_RATE = 15 * 1000;//每隔15秒進行一次對長連接的心跳檢測
private static final String WEBSOCKET_HOST_AND_PORT = "ws://xxx:9501";//可替換為自己的主機名和埠號
private WebSocket mWebSocket;
// 初始化socket
private void initSocket() throws UnknownHostException, IOException {
OkHttpClient client = new OkHttpClient.Builder().readTimeout(0, TimeUnit.MILLISECONDS).build();
Request request = new Request.Builder().url(WEBSOCKET_HOST_AND_PORT).build();
client.newWebSocket(request, new WebSocketListener() {
@Override
public void onOpen(WebSocket webSocket, Response response) {//開啟長連接成功的回呼
super.onOpen(webSocket, response);
mWebSocket = webSocket;
}
@Override
public void onMessage(WebSocket webSocket, String text) {//接收訊息的回呼
super.onMessage(webSocket, text);
//收到服務器端傳過來的訊息text
}
@Override
public void onMessage(WebSocket webSocket, ByteString bytes) {
super.onMessage(webSocket, bytes);
}
@Override
public void onClosing(WebSocket webSocket, int code, String reason) {
super.onClosing(webSocket, code, reason);
}
@Override
public void onClosed(WebSocket webSocket, int code, String reason) {
super.onClosed(webSocket, code, reason);
}
@Override
public void onFailure(WebSocket webSocket, Throwable t, @Nullable Response response) {//長連接連接失敗的回呼
super.onFailure(webSocket, t, response);
}
});
client.dispatcher().executorService().shutdown();
mHandler.postDelayed(heartBeatRunnable, HEART_BEAT_RATE);//開啟心跳檢測
}
5.開啟心跳檢測:
private long sendTime = 0L;
// 發送心跳包
private Handler mHandler = new Handler();
private Runnable heartBeatRunnable = new Runnable() {
@Override
public void run() {
if (System.currentTimeMillis() - sendTime >= HEART_BEAT_RATE) {
boolean isSuccess = mWebSocket.send("");//發送一個空訊息給服務器,通過發送訊息的成功失敗來判斷長連接的連接狀態
if (!isSuccess) {//長連接已斷開
mHandler.removeCallbacks(heartBeatRunnable);
mWebSocket.cancel();//取消掉以前的長連接
new InitSocketThread().start();//創建一個新的連接
} else {//長連接處于連接狀態
}
sendTime = System.currentTimeMillis();
}
mHandler.postDelayed(this, HEART_BEAT_RATE);//每隔一定的時間,對長連接進行一次心跳檢測
}
};
6.當BackService關閉時,關閉掉長連接:
@Override
public void onDestroy() {
super.onDestroy();
if (mWebSocket != null) {
mWebSocket.close(1000, null);
}
}
7.BackService類完整代碼
import android.app.Application;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;
import androidx.annotation.Nullable;
import com.example.mytest.application.BaseApplication;
import java.io.IOException;
import java.net.UnknownHostException;
import java.util.concurrent.TimeUnit;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.WebSocket;
import okhttp3.WebSocketListener;
import okio.ByteString;
public class BackService extends Service {
public Application application;
public Context context;
/**
* 心跳檢測時間
*/
private static final long HEART_BEAT_RATE = 15 * 1000;//每隔15秒進行一次對長連接的心跳檢測
private static final String WEBSOCKET_HOST_AND_PORT = "ws://172.20.13.91:8004/websocket/";//可替換為自己的主機名和埠號
private WebSocket mWebSocket;
@Override
public void onCreate() {
super.onCreate();
if (mWebSocket != null) {
mWebSocket.close(1000, null);
}
new InitSocketThread().start();
//application= BaseApplication.getApplication();//這個是application,需要在功能清單里面的--android:name=".main.app.TzApplication"
//context=BaseApplication.getApplication();
Log.e("TAG","onCreate------------*************-------------");
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
super.onDestroy();
if (mWebSocket != null){
mWebSocket.close(1000,null);
}
}
public class InitSocketThread extends Thread {
@Override
public void run() {
super.run();
try {
initSocket();
} catch (IOException e) {
e.printStackTrace();
}
}
// 初始化socket
private void initSocket() throws UnknownHostException, IOException {
OkHttpClient client = new OkHttpClient.Builder().readTimeout(0, TimeUnit.MILLISECONDS).build();
Request request = new Request.Builder().url(WEBSOCKET_HOST_AND_PORT).build();
client.newWebSocket(request, new WebSocketListener() {
@Override
public void onOpen(WebSocket webSocket, Response response) {//開啟長連接成功的回呼
super.onOpen(webSocket, response);
mWebSocket = webSocket;
}
@Override
public void onMessage(WebSocket webSocket, String text) {//接收訊息的回呼
super.onMessage(webSocket, text);
//收到服務器端傳過來的訊息text
Log.e("TAG", "收到來自后臺的資訊-------------" + text);
}
@Override
public void onMessage(WebSocket webSocket, ByteString bytes) {
super.onMessage(webSocket, bytes);
}
@Override
public void onClosing(WebSocket webSocket, int code, String reason) {
super.onClosing(webSocket, code, reason);
}
@Override
public void onClosed(WebSocket webSocket, int code, String reason) {
super.onClosed(webSocket, code, reason);
}
@Override
public void onFailure(WebSocket webSocket, Throwable t, @Nullable Response response) {//長連接連接失敗的回呼
super.onFailure(webSocket, t, response);
}
});
client.dispatcher().executorService().shutdown();
mHandler.postDelayed(heartBeatRunnable, HEART_BEAT_RATE);//開啟心跳檢測
}
private long sendTime = 0L;
// 發送心跳包
private Handler mHandler = new Handler();
private Runnable heartBeatRunnable = new Runnable() {
@Override
public void run() {
if (System.currentTimeMillis() - sendTime >= HEART_BEAT_RATE) {
boolean isSuccess = mWebSocket.send("");//發送一個空訊息給服務器,通過發送訊息的成功失敗來判斷長連接的連接狀態
if (!isSuccess) {//長連接已斷開
mHandler.removeCallbacks(heartBeatRunnable);
mWebSocket.cancel();//取消掉以前的長連接
new com.example.mytest.websocket.thread.InitSocketThread().start();//創建一個新的連接
} else {//長連接處于連接狀態
//長連接處于連接狀態---
Log.e("TAG", "發送心跳包-------------長連接處于連接狀態");
}
sendTime = System.currentTimeMillis();
}
mHandler.postDelayed(this, HEART_BEAT_RATE);//每隔一定的時間,對長連接進行一次心跳檢測
}
};
}
}
8.在你想要長連接的地方連接
public class TestActivity extends AppCompatActivity {
private Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
initView();
}
private void initView() {
findViewById(R.id.btn_start).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
start();
}
});
findViewById(R.id.btn_stop).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
stop();
}
});
}
private void start() {
intent = new Intent(TestActivity.this, BackService.class);
startService(intent);
Log.e("TAG", "start----");
}
private void stop() {
stopService(intent);
Log.e("TAG", "stop----");
}
}
9.websocket客戶端測驗工具
websocket客戶端測驗工具
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/261410.html
標籤:其他
上一篇:AndroidX遷移和方法
