Package org.apache.tomcat.util.net
Class NioChannel
- java.lang.Object
-
- org.apache.tomcat.util.net.NioChannel
-
- All Implemented Interfaces:
Closeable,AutoCloseable,ByteChannel,Channel,GatheringByteChannel,ReadableByteChannel,ScatteringByteChannel,WritableByteChannel
- Direct Known Subclasses:
SecureNioChannel
public class NioChannel extends Object implements ByteChannel, ScatteringByteChannel, GatheringByteChannel
Base class for a SocketChannel wrapper used by the endpoint. This way, logic for an SSL socket channel remains the same as for a non SSL, making sure we don't need to code for any exception cases.
-
-
Field Summary
Fields Modifier and Type Field Description protected SocketBufferHandlerbufHandlerprotected static ByteBufferemptyBufprotected SocketChannelscprotected static StringManagersmprotected NioEndpoint.NioSocketWrappersocketWrapper
-
Constructor Summary
Constructors Constructor Description NioChannel(SocketBufferHandler bufHandler)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description protected voidcheckInterruptStatus()This method should be used to check the interrupt status before attempting a write.voidclose()Closes this channel.voidclose(boolean force)Close the connection.booleanflush(boolean block, Selector s, long timeout)Returns true if the network buffer has been flushed out and is empty.booleanflushOutbound()Return true if the buffer wrote data.voidfree()Free the channel memoryprotected ApplicationBufferHandlergetAppReadBufHandler()SocketBufferHandlergetBufHandler()SocketChannelgetIOChannel()intgetOutboundRemaining()inthandshake(boolean read, boolean write)Performs SSL handshake hence is a no-op for the non-secure implementation.booleanisClosing()booleanisHandshakeComplete()booleanisOpen()Tells whether or not this channel is open.intread(ByteBuffer dst)Reads a sequence of bytes from this channel into the given buffer.longread(ByteBuffer[] dsts)longread(ByteBuffer[] dsts, int offset, int length)voidreset(SocketChannel channel, NioEndpoint.NioSocketWrapper socketWrapper)Reset the channelvoidsetAppReadBufHandler(ApplicationBufferHandler handler)StringtoString()intwrite(ByteBuffer src)Writes a sequence of bytes to this channel from the given buffer.longwrite(ByteBuffer[] srcs)longwrite(ByteBuffer[] srcs, int offset, int length)
-
-
-
Field Detail
-
sm
protected static final StringManager sm
-
emptyBuf
protected static final ByteBuffer emptyBuf
-
bufHandler
protected final SocketBufferHandler bufHandler
-
sc
protected SocketChannel sc
-
socketWrapper
protected NioEndpoint.NioSocketWrapper socketWrapper
-
-
Constructor Detail
-
NioChannel
public NioChannel(SocketBufferHandler bufHandler)
-
-
Method Detail
-
reset
public void reset(SocketChannel channel, NioEndpoint.NioSocketWrapper socketWrapper) throws IOException
Reset the channel- Parameters:
channel- the socket channelsocketWrapper- the socket wrapper- Throws:
IOException- If a problem was encountered resetting the channel
-
free
public void free()
Free the channel memory
-
flush
public boolean flush(boolean block, Selector s, long timeout) throws IOExceptionReturns true if the network buffer has been flushed out and is empty.- Parameters:
block- Unused. May be used when overriddens- Unused. May be used when overriddentimeout- Unused. May be used when overridden- Returns:
- Always returns
truesince there is no network buffer in the regular channel - Throws:
IOException- Never for non-secure channel
-
close
public void close() throws IOExceptionCloses this channel.- Specified by:
closein interfaceAutoCloseable- Specified by:
closein interfaceChannel- Specified by:
closein interfaceCloseable- Throws:
IOException- If an I/O error occurs
-
close
public void close(boolean force) throws IOExceptionClose the connection.- Parameters:
force- Should the underlying socket be forcibly closed?- Throws:
IOException- If closing the secure channel fails.
-
isOpen
public boolean isOpen()
Tells whether or not this channel is open.
-
write
public int write(ByteBuffer src) throws IOException
Writes a sequence of bytes to this channel from the given buffer.- Specified by:
writein interfaceWritableByteChannel- Parameters:
src- The buffer from which bytes are to be retrieved- Returns:
- The number of bytes written, possibly zero
- Throws:
IOException- If some other I/O error occurs
-
write
public long write(ByteBuffer[] srcs) throws IOException
- Specified by:
writein interfaceGatheringByteChannel- Throws:
IOException
-
write
public long write(ByteBuffer[] srcs, int offset, int length) throws IOException
- Specified by:
writein interfaceGatheringByteChannel- Throws:
IOException
-
read
public int read(ByteBuffer dst) throws IOException
Reads a sequence of bytes from this channel into the given buffer.- Specified by:
readin interfaceReadableByteChannel- Parameters:
dst- The buffer into which bytes are to be transferred- Returns:
- The number of bytes read, possibly zero, or
-1if the channel has reached end-of-stream - Throws:
IOException- If some other I/O error occurs
-
read
public long read(ByteBuffer[] dsts) throws IOException
- Specified by:
readin interfaceScatteringByteChannel- Throws:
IOException
-
read
public long read(ByteBuffer[] dsts, int offset, int length) throws IOException
- Specified by:
readin interfaceScatteringByteChannel- Throws:
IOException
-
getBufHandler
public SocketBufferHandler getBufHandler()
-
getIOChannel
public SocketChannel getIOChannel()
-
isClosing
public boolean isClosing()
-
isHandshakeComplete
public boolean isHandshakeComplete()
-
handshake
public int handshake(boolean read, boolean write) throws IOExceptionPerforms SSL handshake hence is a no-op for the non-secure implementation.- Parameters:
read- Unused in non-secure implementationwrite- Unused in non-secure implementation- Returns:
- Always returns zero
- Throws:
IOException- Never for non-secure channel
-
getOutboundRemaining
public int getOutboundRemaining()
-
flushOutbound
public boolean flushOutbound() throws IOExceptionReturn true if the buffer wrote data. NO-OP for non-secure channel.- Returns:
- Always returns
falsefor non-secure channel - Throws:
IOException- Never for non-secure channel
-
checkInterruptStatus
protected void checkInterruptStatus() throws IOExceptionThis method should be used to check the interrupt status before attempting a write. If a thread has been interrupted and the interrupt has not been cleared then an attempt to write to the socket will fail. When this happens the socket is removed from the poller without the socket being selected. This results in a connection limit leak for NIO as the endpoint expects the socket to be selected even in error conditions.- Throws:
IOException- If the current thread was interrupted
-
setAppReadBufHandler
public void setAppReadBufHandler(ApplicationBufferHandler handler)
-
getAppReadBufHandler
protected ApplicationBufferHandler getAppReadBufHandler()
-
-