LanServerDetection.java

net.minecraft.client.server.LanServerDetection

信息

  • 全限定名:net.minecraft.client.server.LanServerDetection
  • 类型:public class
  • 包:net.minecraft.client.server
  • 源码路径:src/main/java/net/minecraft/client/server/LanServerDetection.java
  • 起始行号:L20
  • 职责:

    TODO

字段/常量

  • UNIQUE_THREAD_ID

    • 类型: AtomicInteger
    • 修饰符: private static final
    • 源码定位: L21
    • 说明:

      TODO

  • LOGGER

    • 类型: Logger
    • 修饰符: private static final
    • 源码定位: L22
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.client.server.LanServerDetection.LanServerDetector

    • 类型: class
    • 修饰符: public static
    • 源码定位: L25
    • 说明:

      TODO

  • net.minecraft.client.server.LanServerDetection.LanServerList

    • 类型: class
    • 修饰符: public static
    • 源码定位: L72
    • 说明:

      TODO

构造器

方法

下面的方法块按源码顺序生成。

代码

@OnlyIn(Dist.CLIENT)
public class LanServerDetection {
    private static final AtomicInteger UNIQUE_THREAD_ID = new AtomicInteger(0);
    private static final Logger LOGGER = LogUtils.getLogger();
 
    @OnlyIn(Dist.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);
        }
 
        @Override
        public void run() {
            byte[] buf = new byte[1024];
 
            while (!this.isInterrupted()) {
                DatagramPacket packet = new DatagramPacket(buf, buf.length);
 
                try {
                    this.socket.receive(packet);
                } catch (SocketTimeoutException var5) {
                    continue;
                } catch (IOException var6) {
                    LanServerDetection.LOGGER.error("Couldn't ping server", (Throwable)var6);
                    break;
                }
 
                String received = new String(packet.getData(), packet.getOffset(), packet.getLength(), StandardCharsets.UTF_8);
                LanServerDetection.LOGGER.debug("{}: {}", packet.getAddress(), received);
                this.serverList.addServer(received, packet.getAddress());
            }
 
            try {
                this.socket.leaveGroup(this.pingGroup);
            } catch (IOException var4) {
            }
 
            this.socket.close();
        }
    }
 
    @OnlyIn(Dist.CLIENT)
    public static class LanServerList {
        private final List<LanServer> servers = Lists.newArrayList();
        private boolean isDirty;
 
        public synchronized @Nullable List<LanServer> takeDirtyServers() {
            if (this.isDirty) {
                List<LanServer> newServers = List.copyOf(this.servers);
                this.isDirty = false;
                return newServers;
            } else {
                return null;
            }
        }
 
        public synchronized void addServer(String pingData, InetAddress socketAddress) {
            String motd = LanServerPinger.parseMotd(pingData);
            String address = LanServerPinger.parseAddress(pingData);
            if (address != null) {
                address = socketAddress.getHostAddress() + ":" + address;
                boolean found = false;
 
                for (LanServer server : this.servers) {
                    if (server.getAddress().equals(address)) {
                        server.updatePingTime();
                        found = true;
                        break;
                    }
                }
 
                if (!found) {
                    this.servers.add(new LanServer(motd, address));
                    this.isDirty = true;
                }
            }
        }
    }
}

引用的其他类

  • DefaultUncaughtExceptionHandler

    • 引用位置: 构造调用
    • 关联成员: DefaultUncaughtExceptionHandler()
  • LanServer

    • 引用位置: 构造调用
    • 关联成员: LanServer()
  • LanServerPinger

    • 引用位置: 方法调用
    • 关联成员: LanServerPinger.parseAddress(), LanServerPinger.parseMotd()