示例#1
0
    @Override
    protected void doWrite(boolean block) throws IOException {
      socketBufferHandler.configureWriteBufferForRead();

      long writeTimeout = getWriteTimeout();
      Selector selector = null;
      try {
        selector = pool.get();
      } catch (IOException x) {
        // Ignore
      }
      try {
        pool.write(
            socketBufferHandler.getWriteBuffer(), getSocket(), selector, writeTimeout, block);
        if (block) {
          // Make sure we are flushed
          do {
            if (getSocket().flush(true, selector, writeTimeout)) break;
          } while (true);
        }
        lastWrite = System.currentTimeMillis();
      } finally {
        if (selector != null) {
          pool.put(selector);
        }
      }
      // If there is data left in the buffer the socket will be registered for
      // write further up the stack. This is to ensure the socket is only
      // registered for write once as both container and user code can trigger
      // write registration.
    }
示例#2
0
 private int fillReadBuffer(boolean block) throws IOException {
   int nRead;
   NioChannel channel = getSocket();
   socketBufferHandler.configureReadBufferForWrite();
   if (block) {
     Selector selector = null;
     try {
       selector = pool.get();
     } catch (IOException x) {
       // Ignore
     }
     try {
       NioEndpoint.NioSocketWrapper att = (NioEndpoint.NioSocketWrapper) channel.getAttachment();
       if (att == null) {
         throw new IOException("Key must be cancelled.");
       }
       nRead =
           pool.read(
               socketBufferHandler.getReadBuffer(), channel, selector, att.getReadTimeout());
     } finally {
       if (selector != null) {
         pool.put(selector);
       }
     }
   } else {
     nRead = channel.read(socketBufferHandler.getReadBuffer());
     if (nRead == -1) {
       throw new EOFException();
     }
   }
   return nRead;
 }