@Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { DatagramPacket datagramPacket = (DatagramPacket) msg; Packet packet = PacketDecoder.decodeFrame(datagramPacket); receiver.onReceive(packet, connection); datagramPacket.release();//最后一个使用方要释放引用 }
/** * 收到输入 */ void input(DatagramPacket dp) { if (this.running) { this.inputs.add(dp); synchronized (this.lock) { lock.notify(); } } else { dp.release(); } }
/** * 收到服务器消息 * * @param dp */ private void onReceive(DatagramPacket dp) { if (this.kcp != null && this.running) { this.kcp.input(dp.content()); synchronized (this.waitLock) { this.waitLock.notify(); } } else { dp.release(); } }
/** * 释放所有内存 */ private void release() { for (DatagramPacket dp : this.inputs) { dp.release(); } this.inputs.clear(); for (KcpOnUdp ku : this.kcps.values()) { if (!ku.isClosed()) { ku.release(); } } this.kcps.clear(); }
/** * receive DatagramPacket * * @param dp */ private void onReceive(DatagramPacket dp) { if (this.running) { InetSocketAddress sender = dp.sender(); int hash = sender.hashCode(); hash = hash < 0 ? -hash : hash; this.workers[hash % workers.length].input(dp); } else { dp.release(); } }
responsePacket.release();