예제 #1
0
  /**
   * 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);
    }
  }
예제 #2
0
  /**
   * 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;
  }