protected void streamOpen(Session session) {
   String identifier = session.getAddress() + ":" + session.getPort();
   byte[] buffer =
       Binary.appendBytes(
           RakNet.PACKET_OPEN_SESSION,
           new byte[] {(byte) (identifier.length() & 0xff)},
           identifier.getBytes(StandardCharsets.UTF_8),
           new byte[] {(byte) (session.getAddress().length() & 0xff)},
           session.getAddress().getBytes(StandardCharsets.UTF_8),
           Binary.writeShort(session.getPort()),
           Binary.writeLong(session.getID()));
   this.server.pushThreadToMainPacket(buffer);
 }
 public void removeSession(Session session, String reason) throws Exception {
   String id = session.getAddress() + ":" + session.getPort();
   if (this.sessions.containsKey(id)) {
     this.sessions.get(id).close();
     this.sessions.remove(id);
     this.streamClose(id, reason);
   }
 }
 public void streamEncapsulated(Session session, EncapsulatedPacket packet, int flags) {
   String id = session.getAddress() + ":" + session.getPort();
   byte[] buffer =
       Binary.appendBytes(
           RakNet.PACKET_ENCAPSULATED,
           new byte[] {(byte) (id.length() & 0xff)},
           id.getBytes(StandardCharsets.UTF_8),
           new byte[] {(byte) (flags & 0xff)},
           packet.toBinary(true));
   this.server.pushThreadToMainPacket(buffer);
 }
 public void notifyACK(Session session, int identifierACK) {
   this.streamACK(session.getAddress() + ":" + session.getPort(), identifierACK);
 }