PacketProcessor.java

net.minecraft.network.PacketProcessor

信息

  • 全限定名:net.minecraft.network.PacketProcessor
  • 类型:public class
  • 包:net.minecraft.network
  • 源码路径:src/main/java/net/minecraft/network/PacketProcessor.java
  • 起始行号:L12
  • 实现:AutoCloseable
  • 职责:

    TODO

字段/常量

  • LOGGER

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

      TODO

  • packetsToBeHandled

    • 类型: Queue<PacketProcessor.ListenerAndPacket<?>>
    • 修饰符: private final
    • 源码定位: L14
    • 说明:

      TODO

  • runningThread

    • 类型: Thread
    • 修饰符: private final
    • 源码定位: L15
    • 说明:

      TODO

  • closed

    • 类型: boolean
    • 修饰符: private
    • 源码定位: L16
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.network.PacketProcessor.ListenerAndPacket
    • 类型: record
    • 修饰符: private
    • 源码定位: L47
    • 说明:

      TODO

构造器

public PacketProcessor(Thread runningThread) @ L18

  • 构造器名:PacketProcessor
  • 源码定位:L18
  • 修饰符:public

参数:

  • runningThread: Thread

说明:

TODO

方法

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

public boolean isSameThread() @ L22

  • 方法名:isSameThread
  • 源码定位:L22
  • 返回类型:boolean
  • 修饰符:public

参数:

说明:

TODO

public <T extends PacketListener> void scheduleIfPossible(T listener, Packet<T> packet) @ L26

  • 方法名:scheduleIfPossible
  • 源码定位:L26
  • 返回类型: void
  • 修饰符:public

参数:

  • listener: T
  • packet: Packet

说明:

TODO

public void processQueuedPackets() @ L34

  • 方法名:processQueuedPackets
  • 源码定位:L34
  • 返回类型:void
  • 修饰符:public

参数:

说明:

TODO

public void close() @ L42

  • 方法名:close
  • 源码定位:L42
  • 返回类型:void
  • 修饰符:public

参数:

说明:

TODO

代码

public class PacketProcessor implements AutoCloseable {
    private static final Logger LOGGER = LogUtils.getLogger();
    private final Queue<PacketProcessor.ListenerAndPacket<?>> packetsToBeHandled = Queues.newConcurrentLinkedQueue();
    private final Thread runningThread;
    private boolean closed;
 
    public PacketProcessor(Thread runningThread) {
        this.runningThread = runningThread;
    }
 
    public boolean isSameThread() {
        return Thread.currentThread() == this.runningThread;
    }
 
    public <T extends PacketListener> void scheduleIfPossible(T listener, Packet<T> packet) {
        if (this.closed) {
            throw new RejectedExecutionException("Server already shutting down");
        } else {
            this.packetsToBeHandled.add(new PacketProcessor.ListenerAndPacket<>(listener, packet));
        }
    }
 
    public void processQueuedPackets() {
        if (!this.closed) {
            while (!this.packetsToBeHandled.isEmpty()) {
                this.packetsToBeHandled.poll().handle();
            }
        }
    }
 
    @Override
    public void close() {
        this.closed = true;
    }
 
    private record ListenerAndPacket<T extends PacketListener>(T listener, Packet<T> packet) {
        public void handle() {
            if (this.listener.shouldHandleMessage(this.packet)) {
                try {
                    this.packet.handle(this.listener);
                } catch (Exception var3) {
                    if (var3 instanceof ReportedException re && re.getCause() instanceof OutOfMemoryError) {
                        throw PacketUtils.makeReportedException(var3, this.packet, this.listener);
                    }
 
                    this.listener.onPacketError(this.packet, var3);
                }
            } else {
                PacketProcessor.LOGGER.debug("Ignoring packet due to disconnection: {}", this.packet);
            }
        }
    }
}

引用的其他类

  • PacketListener

    • 引用位置: 返回值
  • Packet

    • 引用位置: 参数
  • PacketUtils

    • 引用位置: 方法调用
    • 关联成员: PacketUtils.makeReportedException()