server
public class Receive {
public static void main(String[] args) throws Exception {
CharsetEncoder encoder = Charset.forName("UTF-8").newEncoder();
ByteBuffer buffer = ByteBuffer.allocate(1024);
ServerSocketChannel ss = ServerSocketChannel.open();
ss.socket().bind(new InetSocketAddress(8888));
ss.configureBlocking(false);
Selector se = Selector.open();
ss.register(se, SelectionKey.OP_ACCEPT);
while (se.select() > 0) {
Set<SelectionKey> set = se.selectedKeys();
for (SelectionKey key : set) {
if (key.isAcceptable()) {
ServerSocketChannel server = (ServerSocketChannel) key.channel();
SocketChannel channel = server.accept();
channel.configureBlocking(false);
channel.register(se, SelectionKey.OP_READ);
} else if (key.isReadable()) {
SocketChannel sc = (SocketChannel) key.channel();
sc.read(buffer);
buffer.flip();
System.out.println("[server]" + new String(buffer.array(), 0, buffer.limit()));
sc.register(se, SelectionKey.OP_WRITE);
} else if (key.isWritable()) {
SocketChannel sc = (SocketChannel) key.channel();
sc.write(encoder.encode(CharBuffer.wrap("send to client.")));
sc.register(se, SelectionKey.OP_READ);
}
}
set.clear();
}
}
}
client
public class Send {
private String ENCODING_UTF8 = "utf-8";
private ByteBuffer buffer = ByteBuffer.allocate(1024);
private CharsetEncoder encoder = Charset.forName(ENCODING_UTF8).newEncoder();
private String server = "localhost";
private Integer port = 8888;
private SocketChannel channel;
private Selector selector;
private void init() throws IOException, ClosedChannelException {
selector = Selector.open();
channel = SocketChannel.open();
channel.configureBlocking(false);
channel.register(selector, SelectionKey.OP_CONNECT
| SelectionKey.OP_WRITE | SelectionKey.OP_READ);
}
public void connect() throws IOException {
channel.connect(new InetSocketAddress(server, port));
while (selector.select() > 0) {
Set<SelectionKey> readyKeys = selector.selectedKeys();
Iterator<SelectionKey> it = readyKeys.iterator();
while (it.hasNext()) {
SelectionKey key = it.next();
if (key.isConnectable()) {
if (channel.isConnectionPending()) {
channel.finishConnect();
}
onSend(key);
} else if (key.isReadable()) {
onReceive(key);
} else if (key.isWritable()) {
onSend(key);
}
it.remove();
}
}
}
private void onReceive(SelectionKey key) throws IOException {
SocketChannel sc = (SocketChannel) key.channel();
sc.read(buffer);
buffer.flip();
System.out.println("[client]"
+ new String(buffer.array(), 0, buffer.limit()));
}
private void onSend(SelectionKey key) throws IOException {
SocketChannel sc = (SocketChannel) key.channel();
sc.write(encoder.encode(CharBuffer.wrap("send to server.")));
}
public static void main(String[] args) throws Exception {
Send del = new Send();
del.init();
del.connect();
}
}