服务连接函数重构

This commit is contained in:
ZhanGSKen 2025-03-30 14:07:35 +08:00
parent 619fd39a92
commit 9d37de4bfc
6 changed files with 238 additions and 258 deletions

View File

@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle
#Sat Mar 29 20:07:25 GMT 2025
#Sun Mar 30 06:06:05 GMT 2025
stageCount=2
libraryProject=libaes
baseVersion=15.2
publishVersion=15.2.1
buildCount=71
buildCount=85
baseBetaVersion=15.2.2

View File

@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle
#Sat Mar 29 20:07:25 GMT 2025
#Sun Mar 30 06:06:05 GMT 2025
stageCount=2
libraryProject=libaes
baseVersion=15.2
publishVersion=15.2.1
buildCount=71
buildCount=85
baseBetaVersion=15.2.2

View File

@ -156,60 +156,33 @@ public class WinBollClientService extends Service implements IWinBollClientServi
class WinBollClientThread extends Thread {
@Override
public void run() {
//ToastUtils.show("WinBollClientThread");
super.run();
LogUtils.d(TAG, "run syncWinBollClientThreadStatus");
syncWinBollClientThreadStatus();
if (mIsEnableService) {
if (mIsWinBollClientThreadRunning == false) {
// 设置运行状态
mIsWinBollClientThreadRunning = true;
LogUtils.d(TAG, "WinBollClientThread run()");
// 唤醒守护进程
//wakeupAndBindAssistant();
// String username = "";
// String password = "";
// String targetUrl= "";
//
// if (GlobalApplication.isDebuging()) {
// username = PrefUtils.getString(WinBollClientService.this, "metDevUserName", "");
// password = PrefUtils.getString(WinBollClientService.this, "metDevUserPassword", "");
// } else {
// username = "WinBoll";
// password = "WinBollPowerByZhanGSKen";
// }
// targetUrl = "https://" + (GlobalApplication.isDebuging() ?"dev.winboll": "winboll") + ".cc/api/"; // 替换为实际测试的URL
//
while (mIsEnableService) {
// 显示运行状态
//LogUtils.d(TAG, String.format("targetUrl %s", targetUrl));
// WinBollServerConnectionTestThread testThread = new WinBollServerConnectionTestThread(
// targetUrl,
// username,
// password,
// 15000, // 连接超时15秒
// 20000, // 读取超时20秒
// 3 // 最大重试次数
// );
//
// testThread.start();
WinBollServiceStatusView.startConnection();
try {
Thread.sleep(5 * 1000);
Thread.sleep(10 * 1000);
} catch (InterruptedException e) {
LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
}
LogUtils.d(TAG, "while syncWinBollClientThreadStatus");
syncWinBollClientThreadStatus();
//ToastUtils.show("syncServiceThreadStatus OK.");
//ToastUtils.show("mIsExist : " + Boolean.toString(!mIsEnableService));
//break;
}
// 服务进程退出, 重置进程运行状态
WinBollServiceStatusView.stopConnection();
mIsWinBollClientThreadRunning = false;
mWinBollClientThread = null;
}

View File

@ -1,149 +0,0 @@
package cc.winboll.studio.libaes.winboll;
/**
* @Author ZhanGSKen@AliYun.Com
* @Date 2025/03/29 15:57:28
* @Describe WinBoll 服务器服务情况测试访问进程
*/
import cc.winboll.studio.libappbase.LogUtils;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Credentials;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class WinBollServerConnectionTestThread extends Thread {
public static final String TAG = "WinBollClientService";
private final String url;
private final String username;
private final String password;
private final int connectTimeout;
private final int readTimeout;
private final int maxRetries;
private boolean testComplete = false;
public WinBollServerConnectionTestThread(String url, String username, String password) {
this(url, username, password, 10000, 10000, 5);
}
public WinBollServerConnectionTestThread(String url, String username, String password,
int connectTimeout, int readTimeout, int maxRetries) {
this.url = url;
this.username = username;
this.password = password;
this.connectTimeout = connectTimeout;
this.readTimeout = readTimeout;
this.maxRetries = maxRetries;
}
@Override
public void run() {
LogUtils.d(TAG, String.format("run() url %s\nusername %s\npassword %s", url, username, password));
// 构建包含认证信息的请求
String credential = Credentials.basic(username, password);
LogUtils.d(TAG, String.format("credential %s", credential));
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(url)
.header("Accept", "text/plain") // 设置正确的Content-Type头
.header("Authorization", credential)
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
// 处理网络请求失败
LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (!response.isSuccessful()) {
LogUtils.d(TAG, "Unexpected code " + response, Thread.currentThread().getStackTrace());
return;
}
try {
// 读取响应体作为字符串注意这里可能需要解码
String text = response.body().string();
org.jsoup.nodes.Document doc = org.jsoup.Jsoup.parse(text);
LogUtils.d(TAG, doc.text());
// 使用id选择器找到具有特定id的元素
org.jsoup.nodes.Element elementWithId = doc.select("#LastRelease").first(); // 获取第一个匹配的元素
// 提取并打印元素的文本内容
//mszNewestAppPackageName = elementWithId.text();
//ToastUtils.delayedShow(text + "\n" + mszNewestAppPackageName, 5000);
//mHandler.sendMessage(mHandler.obtainMessage(MSG_APPUPDATE_CHECKED));
} catch (Exception e) {
LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
}
}
});
// int retryCount = 0;
// while (!testComplete && retryCount <= maxRetries) {
// LogUtils.d(TAG, "while (!testComplete && retryCount <= maxRetries) {");
// try {
// Response response = client.newCall(request).execute();
// if (response.isSuccessful()) {
// String responseBody = response.body().string();
// if ("OK".equalsIgnoreCase(responseBody.trim())) {
// LogUtils.d(TAG, "[" + new java.util.Date() + "] 测试成功服务器返回OK");
// testComplete = true;
// } else {
// LogUtils.d(TAG, "[" + new java.util.Date() + "] 响应内容不符合预期:" + responseBody);
// }
// } else {
// LogUtils.d(TAG, "[" + new java.util.Date() + "] 请求失败,状态码:" + response.code());
// }
// } catch (IOException e) {
// LogUtils.d(TAG, "[" + new java.util.Date() + "] 连接异常:" + e.getMessage());
// }
//
// if (!testComplete) {
// try {
// Thread.sleep(2000); // 等待2秒后重试
// } catch (InterruptedException e) {
// Thread.currentThread().interrupt();
// LogUtils.d(TAG, "测试线程被中断");
// return;
// }
// retryCount++;
// LogUtils.d(TAG, "[" + new java.util.Date() + "] 第" + retryCount + "次重试...");
// }
// }
//
// if (testComplete) {
//
// } else {
// LogUtils.d(TAG, "[" + new java.util.Date() + "] 达到最大重试次数,测试失败");
// }
}
// public static void main(String[] args) {
// String targetUrl = "http://your-protected-server.com";
// String username = "your_username";
// String password = "your_password";
//
// WinBollServerConnectionTestThread testThread = new WinBollServerConnectionTestThread(
// targetUrl,
// username,
// password,
// 15000, // 连接超时15秒
// 20000, // 读取超时20秒
// 3 // 最大重试次数
// );
//
// testThread.start();
// }
}

View File

@ -0,0 +1,106 @@
package cc.winboll.studio.libaes.winboll;
/**
* @Author ZhanGSKen@AliYun.Com
* @Date 2025/03/29 15:57:28
* @Describe WinBoll 服务器服务情况测试访问进程
*/
import cc.winboll.studio.libappbase.LogUtils;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Credentials;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
// 新增自定义回调接口
interface TextCallback {
void onSuccess(String text);
void onFailure(Exception e);
}
public class WinBollServerConnectionThread extends Thread {
public static final String TAG = "WinBollClientService";
private final String url;
private final String username;
private final String password;
private final int connectTimeout;
private final int readTimeout;
private final int maxRetries;
private final TextCallback callback; // 新增回调成员变量
// 新增带回调的构造函数
public WinBollServerConnectionThread(String url, String username, String password, TextCallback callback) {
this(url, username, password, 10000, 10000, 5, callback);
}
// 修改原有构造函数添加回调参数
public WinBollServerConnectionThread(String url, String username, String password,
int connectTimeout, int readTimeout, int maxRetries, TextCallback callback) {
this.url = url;
this.username = username;
this.password = password;
this.connectTimeout = connectTimeout;
this.readTimeout = readTimeout;
this.maxRetries = maxRetries;
this.callback = callback;
}
@Override
public void run() {
LogUtils.d(TAG, String.format("run() url %s\nusername %s\npassword %s", url, username, password));
String credential = Credentials.basic(username, password);
LogUtils.d(TAG, String.format("credential %s", credential));
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(url)
.header("Accept", "text/plain")
.header("Authorization", credential)
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
// 优先调用自定义回调
if (callback != null) {
callback.onFailure(e);
} else {
LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
}
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (!response.isSuccessful()) {
if (callback != null) {
callback.onFailure(new Exception("Unexpected code " + response));
} else {
LogUtils.d(TAG, "Unexpected code " + response, Thread.currentThread().getStackTrace());
}
return;
}
try {
String text = response.body().string();
// 优先调用自定义回调
if (callback != null) {
callback.onSuccess(text);
} else {
LogUtils.d(TAG, text);
}
} catch (Exception e) {
if (callback != null) {
callback.onFailure(e);
} else {
LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
}
}
}
});
}
}

View File

@ -19,20 +19,12 @@ import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import cc.winboll.studio.libaes.winboll.WinBollClientService;
import cc.winboll.studio.libappbase.GlobalApplication;
import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libapputils.R;
import com.hjq.toast.ToastUtils;
import java.io.IOException;
import cc.winboll.studio.libapputils.utils.PrefUtils;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import okhttp3.Authenticator;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Credentials;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.Route;
//import okhttp3.Authenticator;
//import okhttp3.Credentials;
//import okhttp3.OkHttpClient;
@ -47,9 +39,10 @@ public class WinBollServiceStatusView extends LinearLayout {
public static final int MSG_CONNECTION_INFO = 0;
public static final int MSG_UPDATE_CONNECTION_STATUS = 1;
static WinBollServiceStatusView _WinBollServiceStatusView;
Context mContext;
//boolean mIsConnected;
ConnectionThread mConnectionThread;
volatile ConnectionThread mConnectionThread;
String mszServerHost;
WinBollClientService mWinBollService;
@ -117,6 +110,8 @@ public class WinBollServiceStatusView extends LinearLayout {
}
void initView() {
_WinBollServiceStatusView = this;
mImageView = new ImageView(mContext);
setImageViewByConnection(mImageView, false);
mConnectionStatus = getConnectionStatus();
@ -135,21 +130,10 @@ public class WinBollServiceStatusView extends LinearLayout {
WinBollClientServiceBean.saveBean(mContext, bean);
Intent intent = new Intent(mContext, WinBollClientService.class);
mContext.stopService(intent);
stopConnectionThread();
//stopConnectionThread();
mTextView.setText("");
setImageViewByConnection(mImageView, false);
mConnectionStatus = ConnectionStatus.DISCONNECTED;
//mConnectionStatus = ConnectionStatus.DISCONNECTED;
//
/*//ToastUtils.show("CONNECTED");
setConnectionStatusView(false);
mWinBollServerHostConnectionStatusViewHandler.postMessageText("");
if (mConnectionThread != null) {
mConnectionThread.mIsExist = true;
mConnectionThread = null;
mWinBollServerHostConnectionStatus = WinBollServerHostConnectionStatus.DISCONNECTED;
ToastUtils.show("WinBoll Server Disconnected.");
}*/
} else if (mConnectionStatus == ConnectionStatus.DISCONNECTED) {
LogUtils.d(TAG, "Click to start service.");
WinBollClientServiceBean bean = WinBollClientServiceBean.loadWinBollClientServiceBean(mContext);
@ -157,16 +141,8 @@ public class WinBollServiceStatusView extends LinearLayout {
WinBollClientServiceBean.saveBean(mContext, bean);
Intent intent = new Intent(mContext, WinBollClientService.class);
mContext.startService(intent);
startConnectionThread();
//startConnectionThread();
}
/*if (isConnected) {
mWebView.loadUrl("https://dev.winboll.cc");
} else {
mWebView.stopLoading();
}*/
//ToastUtils.show(mDevelopHostConnectionStatus);
//LogUtils.d(TAG, "mDevelopHostConnectionStatus : " + mWinBollServerHostConnectionStatus);
}
};
setOnClickListener(mViewOnClickListener);
@ -212,32 +188,98 @@ public class WinBollServiceStatusView extends LinearLayout {
}
}
void requestWithBasicAuth(final WinBollServiceViewHandler textViewHandler, String targetUrl, final String username, final String password) {
TextCallback apiTextCallback = new TextCallback() {
@Override
public void onSuccess(String text) {
// 处理成功响应
LogUtils.d(TAG, text);
}
@Override
public void onFailure(Exception e) {
// 处理失败情况
LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
}
};
TextCallback cipTextCallback = new TextCallback() {
@Override
public void onSuccess(String text) {
// 处理成功响应
LogUtils.d(TAG, text);
LogUtils.d(TAG, "Develop Host Connection IP is : " + text);
mConnectionStatus = ConnectionStatus.CONNECTED;
// 获取当前时间
LocalDateTime now = LocalDateTime.now();
// 定义时间格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
// 按照指定格式格式化时间并输出
String formattedDateTime = now.format(formatter);
String msg = "ClientIP<" + formattedDateTime + ">: " + text;
mWinBollServiceViewHandler.postMessageText(msg);
mWinBollServiceViewHandler.postMessageConnectionStatus(true);
}
@Override
public void onFailure(Exception e) {
// 处理失败情况
LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
// 处理网络请求失败
setImageViewByConnection(mImageView, false);
mWinBollServiceViewHandler.postMessageText(e.getMessage());
mWinBollServiceViewHandler.postMessageConnectionStatus(false);
}
};
public void requestAPIWithBasicAuth() {
String targetUrl = "https://" + (GlobalApplication.isDebuging() ?"dev.winboll": "winboll") + ".cc/api/"; // 替换为实际测试的URL
requestWithBasicAuth(targetUrl, apiTextCallback);
}
public void requestCIPWithBasicAuth() {
String targetUrl = mszServerHost + "/cip/?simple=true";
requestWithBasicAuth(targetUrl, cipTextCallback);
}
public void requestWithBasicAuth(String targetUrl, TextCallback callback) {
String username = "";
String password = "";
if (GlobalApplication.isDebuging()) {
username = PrefUtils.getString(mContext, "metDevUserName", "");
password = PrefUtils.getString(mContext, "metDevUserPassword", "");
} else {
username = "WinBoll";
password = "WinBollPowerByZhanGSKen";
}
LogUtils.d(TAG, String.format("Connection Start. targetUrl %s", targetUrl));
WinBollServerConnectionThread thread = new WinBollServerConnectionThread(
targetUrl,
username,
password,
cipTextCallback
);
thread.start();
}
/*void requestWithBasicAuth(final WinBollServiceViewHandler textViewHandler, String targetUrl, final String username, final String password) {
// 用户名和密码替换为实际的认证信息
//String username = "your_username";
//String password = "your_password";
LogUtils.d(TAG, "requestWithBasicAuth(...)");
LogUtils.d(TAG, String.format("targetUrl %s", targetUrl));
OkHttpClient client = new OkHttpClient.Builder()
.authenticator(new Authenticator() {
@Override
public Request authenticate(Route route, Response response) throws IOException {
String credential = Credentials.basic(username, password);
return response.request().newBuilder()
.header("Authorization", credential)
.build();
}
})
.build();
// 构建包含认证信息的请求
String credential = Credentials.basic(username, password);
LogUtils.d(TAG, String.format("credential %s", credential));
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(targetUrl) // 替换为实际要请求的网页地址
.url(targetUrl)
.header("Accept", "text/plain") // 设置正确的Content-Type头
.header("Authorization", credential)
.build();
//Response response = client.newCall(request).execute();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
@ -275,7 +317,7 @@ public class WinBollServiceStatusView extends LinearLayout {
String formattedDateTime = now.format(formatter);
textViewHandler.postMessageText("ClientIP<" + formattedDateTime + ">: " + text);
textViewHandler.postMessageConnectionStatus(true);
//org.jsoup.nodes.Document doc = org.jsoup.Jsoup.parse(text);
//LogUtils.d(TAG, doc.text());
@ -288,24 +330,24 @@ public class WinBollServiceStatusView extends LinearLayout {
//mHandler.sendMessage(mHandler.obtainMessage(MSG_APPUPDATE_CHECKED));
//System.out.println(response.body().string());
// mConnectionStatus = ConnectionStatus.CONNECTED;
// // 获取当前时间
// LocalDateTime now = LocalDateTime.now();
//
// // 定义时间格式
// DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
// // 按照指定格式格式化时间并输出
// String formattedDateTime = now.format(formatter);
// //System.out.println(formattedDateTime);
// textViewHandler.postMessageText("ClientIP<" + formattedDateTime + ">: " + response.body().string());
// textViewHandler.postMessageConnectionStatus(true);
// mConnectionStatus = ConnectionStatus.CONNECTED;
// // 获取当前时间
// LocalDateTime now = LocalDateTime.now();
//
// // 定义时间格式
// DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
// // 按照指定格式格式化时间并输出
// String formattedDateTime = now.format(formatter);
// //System.out.println(formattedDateTime);
// textViewHandler.postMessageText("ClientIP<" + formattedDateTime + ">: " + response.body().string());
// textViewHandler.postMessageConnectionStatus(true);
} catch (Exception e) {
LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
}
}
});
}
}*/
class WinBollServiceViewHandler extends Handler {
WinBollServiceStatusView mDevelopHostConnectionStatusView;
@ -340,7 +382,19 @@ public class WinBollServiceStatusView extends LinearLayout {
}
}
public void startConnectionThread() {
public static void startConnection() {
if (_WinBollServiceStatusView != null) {
_WinBollServiceStatusView.startConnectionThread();
}
}
public static void stopConnection() {
if (_WinBollServiceStatusView != null) {
_WinBollServiceStatusView.stopConnectionThread();
}
}
void startConnectionThread() {
if (mConnectionStatus == ConnectionStatus.DISCONNECTED) {
mConnectionStatus = ConnectionStatus.START_CONNECT;
LogUtils.d(TAG, "startConnectionThread");
@ -350,13 +404,13 @@ public class WinBollServiceStatusView extends LinearLayout {
mConnectionThread = new ConnectionThread();
mConnectionThread.start();
} else if (mConnectionStatus == ConnectionStatus.CONNECTING) {
LogUtils.d(TAG, "mConnectionStatus == ConnectionStatus.CONNECTING");
//LogUtils.d(TAG, "mConnectionStatus == ConnectionStatus.CONNECTING");
} else {
LogUtils.d(TAG, "Unknow mConnectionStatus, can not start ConnectionThread.");
}
}
public void stopConnectionThread() {
void stopConnectionThread() {
if (mConnectionStatus == ConnectionStatus.CONNECTED) {
LogUtils.d(TAG, "stopConnectionThread");
if (mConnectionThread != null) {
@ -368,6 +422,8 @@ public class WinBollServiceStatusView extends LinearLayout {
}
}
class ConnectionThread extends Thread {
public volatile boolean mIsExist;
@ -387,14 +443,8 @@ public class WinBollServiceStatusView extends LinearLayout {
while (mIsExist == false) {
if (mConnectionStatus == ConnectionStatus.START_CONNECT) {
mConnectionStatus = ConnectionStatus.CONNECTING;
//ToastUtils.show("WinBoll Server Connection Start.");
//String targetUrl = "https://" + (GlobalApplication.isDebuging() ?"dev.winboll": "winboll") + ".cc/api/"; // 替换为实际测试的URL
//String targetUrl = "https://" + mszServerHost + "/api/"; // 这里替换成你实际要访问的网址
String targetUrl = mszServerHost + "/cip/?simple=true"; // 这里替换成你实际要访问的网址
LogUtils.d(TAG, String.format("Connection Start. targetUrl %s", targetUrl));
requestWithBasicAuth(mWinBollServiceViewHandler, targetUrl, _mUserName, _mPassword);
//requestAPIWithBasicAuth();
requestCIPWithBasicAuth();
} else if (mConnectionStatus == ConnectionStatus.CONNECTED
|| mConnectionStatus == ConnectionStatus.DISCONNECTED) {
//ToastUtils.show("mWinBollServerHostConnectionStatus " + mConnectionStatus);