/** * Method writePacket. * * @param key SelectionKey */ protected void writePacket(SelectionKey key) { MMOConnection<T> con = (MMOConnection<T>) key.attachment(); prepareWriteBuffer(con); DIRECT_WRITE_BUFFER.flip(); int size = DIRECT_WRITE_BUFFER.remaining(); int result = -1; try { result = con.getWritableChannel().write(DIRECT_WRITE_BUFFER); } catch (IOException e) { // error handling goes on the if bellow } // check if no error happened if (result >= 0) { stats.increaseOutgoingBytes(result); // check if we written everything if (result != size) { con.createWriteBuffer(DIRECT_WRITE_BUFFER); } if (!con.getSendQueue().isEmpty() || con.hasPendingWriteBuffer()) { con.scheduleWriteInterest(); } } else { con.onForcedDisconnection(); closeConnectionImpl(con); } }
/** * Method prepareWriteBuffer. * * @param con MMOConnection<T> */ protected void prepareWriteBuffer(MMOConnection<T> con) { WRITE_CLIENT = con.getClient(); DIRECT_WRITE_BUFFER.clear(); if (con.hasPendingWriteBuffer()) { con.movePendingWriteBufferTo(DIRECT_WRITE_BUFFER); } if (DIRECT_WRITE_BUFFER.hasRemaining() && !con.hasPendingWriteBuffer()) { int i; Queue<SendablePacket<T>> sendQueue = con.getSendQueue(); SendablePacket<T> sp; for (i = 0; i < _sc.MAX_SEND_PER_PASS; i++) { synchronized (con) { if ((sp = sendQueue.poll()) == null) { break; } } try { stats.increaseOutgoingPacketsCount(); putPacketIntoWriteBuffer(sp, true); WRITE_BUFFER.flip(); if (DIRECT_WRITE_BUFFER.remaining() >= WRITE_BUFFER.limit()) { DIRECT_WRITE_BUFFER.put(WRITE_BUFFER); } else { con.createWriteBuffer(WRITE_BUFFER); break; } } catch (Exception e) { _log.error("Error in " + getName(), e); break; } } } WRITE_BUFFER.clear(); WRITE_CLIENT = null; }