Package org.apache.tomcat.util.net
Class NioChannel
- java.lang.Object
-
- org.apache.tomcat.util.net.NioChannel
-
- All Implemented Interfaces:
java.io.Closeable
,java.lang.AutoCloseable
,java.nio.channels.ByteChannel
,java.nio.channels.Channel
,java.nio.channels.ReadableByteChannel
,java.nio.channels.WritableByteChannel
- Direct Known Subclasses:
SecureNioChannel
public class NioChannel extends java.lang.Object implements java.nio.channels.ByteChannel
Base class for a SocketChannel wrapper used by the endpoint. This way, logic for a SSL socket channel remains the same as for a non SSL, making sure we don't need to code for any exception cases.- Version:
- 1.0
-
-
Field Summary
Fields Modifier and Type Field Description protected SocketBufferHandler
bufHandler
protected static java.nio.ByteBuffer
emptyBuf
protected NioEndpoint.Poller
poller
protected java.nio.channels.SocketChannel
sc
protected static StringManager
sm
protected SocketWrapperBase<NioChannel>
socketWrapper
-
Constructor Summary
Constructors Constructor Description NioChannel(java.nio.channels.SocketChannel channel, SocketBufferHandler bufHandler)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description protected void
checkInterruptStatus()
This method should be used to check the interrupt status before attempting a write.void
close()
Closes this channel.void
close(boolean force)
Close the connection.boolean
flush(boolean block, java.nio.channels.Selector s, long timeout)
Returns true if the network buffer has been flushed out and is empty.boolean
flushOutbound()
Return true if the buffer wrote data.void
free()
Free the channel memoryprotected ApplicationBufferHandler
getAppReadBufHandler()
java.lang.Object
getAttachment()
SocketBufferHandler
getBufHandler()
java.nio.channels.SocketChannel
getIOChannel()
int
getOutboundRemaining()
NioEndpoint.Poller
getPoller()
int
handshake(boolean read, boolean write)
Performs SSL handshake hence is a no-op for the non-secure implementation.boolean
isClosing()
boolean
isHandshakeComplete()
boolean
isOpen()
Tells whether or not this channel is open.int
read(java.nio.ByteBuffer dst)
Reads a sequence of bytes from this channel into the given buffer.void
reset()
Reset the channelvoid
setAppReadBufHandler(ApplicationBufferHandler handler)
void
setIOChannel(java.nio.channels.SocketChannel IOChannel)
void
setPoller(NioEndpoint.Poller poller)
java.lang.String
toString()
int
write(java.nio.ByteBuffer src)
Writes a sequence of bytes to this channel from the given buffer.
-
-
-
Field Detail
-
sm
protected static final StringManager sm
-
emptyBuf
protected static final java.nio.ByteBuffer emptyBuf
-
sc
protected java.nio.channels.SocketChannel sc
-
socketWrapper
protected SocketWrapperBase<NioChannel> socketWrapper
-
bufHandler
protected final SocketBufferHandler bufHandler
-
poller
protected NioEndpoint.Poller poller
-
-
Constructor Detail
-
NioChannel
public NioChannel(java.nio.channels.SocketChannel channel, SocketBufferHandler bufHandler)
-
-
Method Detail
-
reset
public void reset() throws java.io.IOException
Reset the channel- Throws:
java.io.IOException
- If a problem was encountered resetting the channel
-
free
public void free()
Free the channel memory
-
flush
public boolean flush(boolean block, java.nio.channels.Selector s, long timeout) throws java.io.IOException
Returns 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
true
since there is no network buffer in the regular channel - Throws:
java.io.IOException
- Never for non-secure channel
-
close
public void close() throws java.io.IOException
Closes this channel.- Specified by:
close
in interfacejava.lang.AutoCloseable
- Specified by:
close
in interfacejava.nio.channels.Channel
- Specified by:
close
in interfacejava.io.Closeable
- Throws:
java.io.IOException
- If an I/O error occurs
-
close
public void close(boolean force) throws java.io.IOException
Close the connection.- Parameters:
force
- Should the underlying socket be forcibly closed?- Throws:
java.io.IOException
- If closing the secure channel fails.
-
isOpen
public boolean isOpen()
Tells whether or not this channel is open.- Specified by:
isOpen
in interfacejava.nio.channels.Channel
- Returns:
- true if, and only if, this channel is open
-
write
public int write(java.nio.ByteBuffer src) throws java.io.IOException
Writes a sequence of bytes to this channel from the given buffer.- Specified by:
write
in interfacejava.nio.channels.WritableByteChannel
- Parameters:
src
- The buffer from which bytes are to be retrieved- Returns:
- The number of bytes written, possibly zero
- Throws:
java.io.IOException
- If some other I/O error occurs
-
read
public int read(java.nio.ByteBuffer dst) throws java.io.IOException
Reads a sequence of bytes from this channel into the given buffer.- Specified by:
read
in interfacejava.nio.channels.ReadableByteChannel
- Parameters:
dst
- The buffer into which bytes are to be transferred- Returns:
- The number of bytes read, possibly zero, or -1 if the channel has reached end-of-stream
- Throws:
java.io.IOException
- If some other I/O error occurs
-
getAttachment
public java.lang.Object getAttachment()
-
getBufHandler
public SocketBufferHandler getBufHandler()
-
getPoller
public NioEndpoint.Poller getPoller()
-
getIOChannel
public java.nio.channels.SocketChannel getIOChannel()
-
isClosing
public boolean isClosing()
-
isHandshakeComplete
public boolean isHandshakeComplete()
-
handshake
public int handshake(boolean read, boolean write) throws java.io.IOException
Performs 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:
java.io.IOException
- Never for non-secure channel
-
setPoller
public void setPoller(NioEndpoint.Poller poller)
-
setIOChannel
public void setIOChannel(java.nio.channels.SocketChannel IOChannel)
-
toString
public java.lang.String toString()
- Overrides:
toString
in classjava.lang.Object
-
getOutboundRemaining
public int getOutboundRemaining()
-
flushOutbound
public boolean flushOutbound() throws java.io.IOException
Return true if the buffer wrote data. NO-OP for non-secure channel.- Returns:
- Always returns
false
for non-secure channel - Throws:
java.io.IOException
- Never for non-secure channel
-
checkInterruptStatus
protected void checkInterruptStatus() throws java.io.IOException
This 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:
java.io.IOException
- If the current thread was interrupted
-
setAppReadBufHandler
public void setAppReadBufHandler(ApplicationBufferHandler handler)
-
getAppReadBufHandler
protected ApplicationBufferHandler getAppReadBufHandler()
-
-