ip相同port不同情况修改

This commit is contained in:
2025-08-07 17:53:02 +08:00
parent 1fb8fc499b
commit 952319dab2
3 changed files with 116 additions and 108 deletions

View File

@@ -57,6 +57,9 @@ public class Main extends Service {
// 本机IP地址集合
private Set<String> localIPs = new HashSet<>();
// 本地监听端口
private int localPort = 8888;
// 线程池
private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
private final ExecutorService networkExecutor = Executors.newFixedThreadPool(2);
@@ -145,7 +148,7 @@ public class Main extends Service {
5, 5, TimeUnit.MINUTES);
// 启动应用包检测
printInstalledPackages();
getInstalledPackages();
return START_STICKY;
}
@@ -185,9 +188,10 @@ public class Main extends Service {
}
}
// 检查是否是本机地址
private boolean isLocalAddress(InetAddress address) {
return localIPs.contains(address.getHostAddress());
// 修改 isLocalAddress 方法为 isLocalMessage增加端口判断
private boolean isLocalMessage(InetAddress address, int port) {
// 只有当地址是本机IP且端口是8888时才屏蔽
return localIPs.contains(address.getHostAddress()) && port == localPort;
}
// 根据包名获取应用名称
@@ -203,7 +207,7 @@ public class Main extends Service {
}
// ================= 应用包名检测方法 =================
private void printInstalledPackages() {
private void getInstalledPackages() {
try {
// 获取包管理器
android.content.pm.PackageManager pm = getPackageManager();
@@ -294,12 +298,6 @@ public class Main extends Service {
// 处理接收到的消息
private void handleReceivedMessage(String message, InetAddress senderAddress, int senderPort) {
// 不处理来自本机的消息
if (isLocalAddress(senderAddress)) {
Log.d(TAG, "忽略来自本机的消息: " + senderAddress.getHostAddress());
return;
}
Log.i(TAG, "收到原始消息 -> " + message);
// 解析消息头
if (message.startsWith("MSG:") && message.length() > 5) {
@@ -373,7 +371,7 @@ public class Main extends Service {
// 如果缓冲区过大,可能需要采取措施
if (session.receiveBuffer.size() > 50) {
Log.w(TAG, "接收缓冲区过大,清理旧缓冲数据");
Log.i(TAG, "接收缓冲区过大,清理旧缓冲数据");
// 清理远小于当前期望序列号的缓冲数据
session.receiveBuffer.entrySet().removeIf(entry -> entry.getKey() < session.expectedSequence - 100);
}
@@ -382,7 +380,7 @@ public class Main extends Service {
else if (seq > session.expectedSequence) {
// 如果序列号差距过大,考虑跳过中间缺失的序列号
if (seq - session.expectedSequence > 100) {
Log.w(TAG, "序列号差距过大 (" + session.expectedSequence + " -> " + seq + "),跳过中间序列");
Log.i(TAG, "序列号差距过大 (" + session.expectedSequence + " -> " + seq + "),跳过中间序列");
// 清理旧的缓冲数据
session.receiveBuffer.entrySet().removeIf(entry -> entry.getKey() < session.expectedSequence + 50);
// 跳过缺失的序列号
@@ -392,12 +390,12 @@ public class Main extends Service {
} else {
// 缓存乱序到达的消息
session.receiveBuffer.put(seq, content);
Log.d(TAG, "缓存乱序消息 seq=" + seq + ", 当前期望 seq=" + session.expectedSequence);
Log.i(TAG, "缓存乱序消息 seq=" + seq + ", 当前期望 seq=" + session.expectedSequence);
}
}
// 如果是已经处理过的旧消息seq < expectedSequence则忽略
else {
Log.d(TAG, "忽略重复消息 seq=" + seq + ", 已处理到 seq=" + (session.expectedSequence - 1));
Log.i(TAG, "忽略重复消息 seq=" + seq + ", 已处理到 seq=" + (session.expectedSequence - 1));
}
}
@@ -432,9 +430,13 @@ public class Main extends Service {
callUnity("AppManager", "LaunchApp", packageName);
} else if ("GetPackageInfos".equals(intent)) {
Log.i(TAG, "执行获取所有包信息");
getInstalledPackages();
String escapedPackageNames = packageNames.replace("\"", "\\\""); // 转义引号
String jsonData = "{\"intent\":\"PackageInfos\",\"data\":\"" + escapedPackageNames + "\"}";
sendReliable(senderAddress, 8888, jsonData);
} else if ("playing".equals(intent)) {
String name = jsonMsg.optString("name");
Log.i(TAG, "开始游玩" + name);
}
// 可以根据需要添加更多intent类型
else {
@@ -450,6 +452,7 @@ public class Main extends Service {
callUnity("AppManager", "UnityMethod", "stop");
} else if ("GetPackageInfos".equals(message)) {
Log.i(TAG, "执行获取所有包信息");
getInstalledPackages();
String escapedPackageNames = packageNames.replace("\"", "\\\""); // 转义引号
String jsonData = "{\"intent\":\"PackageInfos\",\"data\":\"" + escapedPackageNames + "\"}";
sendReliable(senderAddress, 8888, jsonData);
@@ -463,8 +466,8 @@ public class Main extends Service {
}
private void sendAck(int seq, InetAddress targetAddress, int targetPort) {
// 不向本机发送ACK
if (isLocalAddress(targetAddress)) {
// 不向本机相同端口发送ACK
if (isLocalMessage(targetAddress, targetPort)) {
return;
}
@@ -485,8 +488,8 @@ public class Main extends Service {
// 可靠发送方法
private void sendReliable(InetAddress targetAddress, int targetPort, String message) {
// 不向本机发送消息
if (isLocalAddress(targetAddress)) {
// 不向本机相同端口发送消息
if (isLocalMessage(targetAddress, targetPort)) {
return;
}
@@ -521,8 +524,8 @@ public class Main extends Service {
// ================= 旧版兼容处理 =================
private void handleLegacyMessage(String message, InetAddress senderAddress, int senderPort) {
// 不处理来自本机的消息
if (isLocalAddress(senderAddress)) {
// 不处理来自本机相同端口的消息
if (isLocalMessage(senderAddress, senderPort)) {
return;
}
@@ -555,7 +558,8 @@ public class Main extends Service {
networkExecutor.execute(() -> {
try {
udpSocket = new DatagramSocket(8888);
udpSocket = new DatagramSocket(localPort);
localPort = udpSocket.getLocalPort(); // 记录本地端口号
byte[] buffer = new byte[BUFFER_SIZE];
while (isRunning) {
@@ -565,10 +569,16 @@ public class Main extends Service {
String receivedData = new String(
packet.getData(), 0, packet.getLength()).trim();
handleReceivedMessage(
receivedData,
packet.getAddress(),
packet.getPort());
// 修改为使用新的判断方法
if (!isLocalMessage(packet.getAddress(), packet.getPort())) {
handleReceivedMessage(
receivedData,
packet.getAddress(),
packet.getPort());
} else {
Log.d(TAG, "忽略来自本机相同端口的消息: " +
packet.getAddress().getHostAddress() + ":" + packet.getPort());
}
}
} catch (Exception e) {
if (isRunning) {