minecraft-src/net/minecraft/client/server/LanServerDetection.java
2025-07-04 01:41:11 +03:00

108 lines
3.3 KiB
Java

package net.minecraft.client.server;
import com.google.common.collect.Lists;
import com.mojang.logging.LogUtils;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.net.SocketTimeoutException;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.DefaultUncaughtExceptionHandler;
import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger;
@Environment(EnvType.CLIENT)
public class LanServerDetection {
static final AtomicInteger UNIQUE_THREAD_ID = new AtomicInteger(0);
static final Logger LOGGER = LogUtils.getLogger();
@Environment(EnvType.CLIENT)
public static class LanServerDetector extends Thread {
private final LanServerDetection.LanServerList serverList;
private final InetAddress pingGroup;
private final MulticastSocket socket;
public LanServerDetector(LanServerDetection.LanServerList serverList) throws IOException {
super("LanServerDetector #" + LanServerDetection.UNIQUE_THREAD_ID.incrementAndGet());
this.serverList = serverList;
this.setDaemon(true);
this.setUncaughtExceptionHandler(new DefaultUncaughtExceptionHandler(LanServerDetection.LOGGER));
this.socket = new MulticastSocket(4445);
this.pingGroup = InetAddress.getByName("224.0.2.60");
this.socket.setSoTimeout(5000);
this.socket.joinGroup(this.pingGroup);
}
public void run() {
byte[] bs = new byte[1024];
while (!this.isInterrupted()) {
DatagramPacket datagramPacket = new DatagramPacket(bs, bs.length);
try {
this.socket.receive(datagramPacket);
} catch (SocketTimeoutException var5) {
continue;
} catch (IOException var6) {
LanServerDetection.LOGGER.error("Couldn't ping server", (Throwable)var6);
break;
}
String string = new String(datagramPacket.getData(), datagramPacket.getOffset(), datagramPacket.getLength(), StandardCharsets.UTF_8);
LanServerDetection.LOGGER.debug("{}: {}", datagramPacket.getAddress(), string);
this.serverList.addServer(string, datagramPacket.getAddress());
}
try {
this.socket.leaveGroup(this.pingGroup);
} catch (IOException var4) {
}
this.socket.close();
}
}
@Environment(EnvType.CLIENT)
public static class LanServerList {
private final List<LanServer> servers = Lists.<LanServer>newArrayList();
private boolean isDirty;
@Nullable
public synchronized List<LanServer> takeDirtyServers() {
if (this.isDirty) {
List<LanServer> list = List.copyOf(this.servers);
this.isDirty = false;
return list;
} else {
return null;
}
}
public synchronized void addServer(String pingResponse, InetAddress ipAddress) {
String string = LanServerPinger.parseMotd(pingResponse);
String string2 = LanServerPinger.parseAddress(pingResponse);
if (string2 != null) {
string2 = ipAddress.getHostAddress() + ":" + string2;
boolean bl = false;
for (LanServer lanServer : this.servers) {
if (lanServer.getAddress().equals(string2)) {
lanServer.updatePingTime();
bl = true;
break;
}
}
if (!bl) {
this.servers.add(new LanServer(string, string2));
this.isDirty = true;
}
}
}
}
}