JAVA NIO menyediakan API untuk menulis server TCP menggunakan arsitektur NIO, sebagai berikut.
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.text.ParseException;
import java.util.*;
public class NIOServer implements Runnable{
private InetAddress addr;
private int port;
private Selector selector;
public NIOServer(InetAddress addr, int port) throws IOException {
this.addr = addr;
this.port = port;
}
public void run(){
try {
startServer();
}catch(IOException ex){
System.out.println(ex.getMessage());
}
}
private void startServer() throws IOException {
this.selector = Selector.open();
ServerSocketChannel serverChannel = serverSocketChannel.open();
serverChannel.configureBlocking(false);
InetSocketAddress listenAddr = new InetSocketAddress(this.addr, this.port);
serverChannel.socket().bind(listenAddr);
serverChannel.register(this.selector, SelectionKey.OP_ACCEPT);
while (true) {
this.selector.select();
Iterator keys = this.selector.selectedKeys().iterator();
while (keys.hasNext()) {
SelectionKey key = (SelectionKey) keys.next();
keys.remove();
if (! key.isValid()) {
continue;
}
if (key.isAcceptable()) {
this.accept(key);
}
else if (key.isReadable()) {
this.read(key);
}
else if (key.isWritable()) {
this.write(key);
}
}
}
}
}
Ini menggunakan satu thread yang akan memproses peristiwa seperti membaca, menulis, dan menerima.
Dibandingkan dengan arsitektur Pemblokiran thread per koneksi, ini lebih disukai karena sifatnya yang non-pemblokiran yang menyebabkan kesalahan cache minimum, overhead thread, dan migrasi CPU yang rendah.
Namun, arsitektur ini hanya menggunakan satu thread. Dalam lingkungan multi-proses (misalnya cpu 4 inti), arsitektur NIO membuang-buang inti lainnya. Apakah ada pendekatan desain yang dapat saya gunakan untuk memanfaatkan semua inti dengan arsitektur NIO?
NIO2 (yang didasarkan pada pola proactor) adalah salah satu opsi tersebut. Namun arsitektur dasarnya sangat berbeda dengan NIO asli.