public class NIOService
extends java.lang.Object
Common usage is to create a single instance of this service and then run one other the select methods in a loop.
Use openSocket(String, int)
to open a socket to a remote server,
and openServerSocket(int)
to open a server socket locally.
Note that the NIOServerSocket by default opens in a "refuse connections" state. To start accepting players, the socket's acceptor must first be set to accept connections. See documentation for openServerSocket for more details.
Example use:
Using the server socket:
Using regular sockets:
NIOService service = new NIOService;
NIOServerSocket serverSocket = service.openServerSocket(1234);
serverSocket.setConnectionAcceptor(myAcceptor);
serverSocket.listen(myObserver);
NIOService service = new NIOService;
NIOSocket socket = service.openSocket("www.google.com", 1234);
socket.listen(myObserver);
// Asynchronous write by default:
socket.write("Some message".getBytes());
Modifier and Type | Field | Description |
---|---|---|
static int |
DEFAULT_IO_BUFFER_SIZE |
Constructor | Description |
---|---|
NIOService() |
Create a new nio service with default buffer size (64kb)
|
NIOService(int ioBufferSize) |
Create a new nio service.
|
Modifier and Type | Method | Description |
---|---|---|
void |
close() |
Close the entire service.
|
int |
getBufferSize() |
Returns the new shared buffer size.
|
java.util.Queue<java.lang.Runnable> |
getQueue() |
Returns a copy of the internal event queue.
|
boolean |
isOpen() |
Determine if this service is open.
|
void |
notifyException(java.lang.Throwable t) |
Logs an exception using the exception observer.
|
NIOServerSocket |
openServerSocket(int port) |
Open a server socket on the given port with the default connection backlog.
|
NIOServerSocket |
openServerSocket(int port,
int backlog) |
Open a server socket on the given port.
|
NIOServerSocket |
openServerSocket(java.net.InetSocketAddress address,
int backlog) |
Open a server socket on the address.
|
NIOSocket |
openSocket(java.lang.String host,
int port) |
Open a normal socket to the host on the given port returning
a NIOSocket.
|
NIOSocket |
openSocket(java.net.InetAddress inetAddress,
int port) |
Open a normal socket to the host on the given port returning
a NIOSocket.
|
NIOServerSocketSSL |
openSSLServerSocket(javax.net.ssl.SSLContext sslContext,
int port) |
Open an SSL server socket on the given port with the default connection backlog.
|
NIOServerSocketSSL |
openSSLServerSocket(javax.net.ssl.SSLContext sslContext,
int port,
int backlog) |
Open an SSL server socket on the given port.
|
NIOServerSocketSSL |
openSSLServerSocket(javax.net.ssl.SSLContext sslContext,
java.net.InetSocketAddress address,
int backlog) |
Open an SSL server socket on the address.
|
NIOSocket |
openSSLSocket(javax.net.ssl.SSLEngine sslEngine,
java.lang.String host,
int port) |
Open a socket to the host on the given port returning
a NIOSocketSSL.
|
NIOSocketSSL |
openSSLSocket(javax.net.ssl.SSLEngine sslEngine,
java.net.InetAddress inetAddress,
int port) |
Open a socket to the host on the given port returning
a NIOSocketSSL.
|
void |
queue(java.lang.Runnable event) |
Queues an event on the NIOService queue.
|
void |
selectBlocking() |
Run all waiting NIO requests, blocking indefinitely
until at least one request is handled.
|
void |
selectBlocking(long timeout) |
Run all waiting NIO requests, blocking until
at least one request is found, or the method has blocked
for the time given by the timeout value, whatever comes first.
|
void |
selectNonBlocking() |
Run all waiting NIO requests, returning immediately if
no requests are found.
|
void |
setBufferSize(int newBufferSize) |
Set the new shared buffer size.
|
void |
setExceptionObserver(ExceptionObserver exceptionObserver) |
Updates the exception observer for the NIOService.
|
void |
wakeup() |
Runs wakeup on the selector, causing any blocking select to be released.
|
public static final int DEFAULT_IO_BUFFER_SIZE
public NIOService() throws java.io.IOException
java.io.IOException
- if we failed to open the underlying selector used by the
service.public NIOService(int ioBufferSize) throws java.io.IOException
ioBufferSize
- the maximum buffer size.java.io.IOException
- if we failed to open the underlying selector used by the
service.java.lang.IllegalArgumentException
- if the buffer size is less than 256 bytes.public void selectBlocking() throws java.io.IOException
java.io.IOException
- if there is an IO error waiting for requests.java.nio.channels.ClosedSelectorException
- if the underlying selector is closed
(in this case, NIOService#isOpen will return false)public void selectNonBlocking() throws java.io.IOException
java.io.IOException
- if there is an IO error waiting for requests.java.nio.channels.ClosedSelectorException
- if the underlying selector is closed.
(in this case, NIOService#isOpen will return false)public void selectBlocking(long timeout) throws java.io.IOException
timeout
- the maximum time to wait for requests.java.lang.IllegalArgumentException
- If the value of the timeout argument is negative.java.io.IOException
- if there is an IO error waiting for requests.java.nio.channels.ClosedSelectorException
- if the underlying selector is closed.
(in this case, NIOService#isOpen will return false)public NIOSocket openSocket(java.lang.String host, int port) throws java.io.IOException
This roughly corresponds to creating a regular socket using new Socket(host, port).
This method is thread-safe.
host
- the host we want to connect to.port
- the port to use for the connection.java.io.IOException
- if registering the new socket failed.public NIOSocket openSSLSocket(javax.net.ssl.SSLEngine sslEngine, java.lang.String host, int port) throws java.io.IOException
This roughly corresponds to creating a regular socket using new SSLSocket(host, port).
This method is thread-safe.
sslEngine
- the SSL engine to use for SSL-negotiation.host
- the host we want to connect to.port
- the port to use for the connection.java.io.IOException
- if registering the new socket failed.public NIOSocket openSocket(java.net.InetAddress inetAddress, int port) throws java.io.IOException
This roughly corresponds to creating a regular socket using new Socket(inetAddress, port).
This method is thread-safe.
inetAddress
- the address we want to connect to.port
- the port to use for the connection.java.io.IOException
- if registering the new socket failed.public NIOSocketSSL openSSLSocket(javax.net.ssl.SSLEngine sslEngine, java.net.InetAddress inetAddress, int port) throws java.io.IOException
This roughly corresponds to creating a regular socket using new SSLSocket(inetAddress, port).
This method is thread-safe.
sslEngine
- the SSL engine to use for SSL-negotiation.inetAddress
- the address we want to connect to.port
- the port to use for the connection.java.io.IOException
- if registering the new socket failed.public NIOServerSocket openServerSocket(int port, int backlog) throws java.io.IOException
This roughly corresponds to using new ServerSocket(port, backlog);
This method is thread-safe.
port
- the port to open.backlog
- the maximum connection backlog (i.e. connections pending accept)java.io.IOException
- if registering the socket fails.public NIOServerSocketSSL openSSLServerSocket(javax.net.ssl.SSLContext sslContext, int port, int backlog) throws java.io.IOException
This roughly corresponds to using new SSLServerSocket(port, backlog);
This method is thread-safe.
sslContext
- the SSLContext to use for SSL-negotiation.port
- the port to open.backlog
- the maximum connection backlog (i.e. connections pending accept)java.io.IOException
- if registering the socket fails.public NIOServerSocket openServerSocket(int port) throws java.io.IOException
This roughly corresponds to using new ServerSocket(port);
This method is thread-safe.
port
- the port to open.java.io.IOException
- if registering the socket fails.public NIOServerSocketSSL openSSLServerSocket(javax.net.ssl.SSLContext sslContext, int port) throws java.io.IOException
This roughly corresponds to using new SSLServerSocket(port);
This method is thread-safe.
sslContext
- the SSLContext to use for SSL-negotiation.port
- the port to open.java.io.IOException
- if registering the socket fails.public NIOServerSocketSSL openSSLServerSocket(javax.net.ssl.SSLContext sslContext, java.net.InetSocketAddress address, int backlog) throws java.io.IOException
This method is thread-safe.
sslContext
- the SSLContext to use for SSL-negotiation.address
- the address to open.backlog
- the maximum connection backlog (i.e. connections pending accept)java.io.IOException
- if registering the socket fails.public NIOServerSocket openServerSocket(java.net.InetSocketAddress address, int backlog) throws java.io.IOException
This method is thread-safe.
address
- the address to open.backlog
- the maximum connection backlog (i.e. connections pending accept)java.io.IOException
- if registering the socket fails.public void setBufferSize(int newBufferSize)
This method is *not* thread-safe.
newBufferSize
- the new buffer size.java.lang.IllegalArgumentException
- if the new size is less than 256 bytes.public int getBufferSize()
public void close()
This will disconnect all sockets associated with this service.
It is not possible to restart the service once closed.
This method is thread-safe.
public boolean isOpen()
This method is thread-safe.
public void queue(java.lang.Runnable event)
This method is thread-safe, but should in general not be used by other applications.
event
- the event to run on the NIOService-thread.public java.util.Queue<java.lang.Runnable> getQueue()
public void wakeup()
public void setExceptionObserver(ExceptionObserver exceptionObserver)
exceptionObserver
- the new exception observer, if this is null, logging will be directed to stderr.public void notifyException(java.lang.Throwable t)
Should only be used on the NIOService thread.
t
- the exception thrown.