Я хочу написать класс, который работал бы с несколькими сокетами в одном потоке. Для этой цели как нельзя лучше подходят SocketChannel и Selector.
С серверной часть проблем нет:
Selector selector = SelectorProvider.provider().openSelector();
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.configureBlocking(false);
serverSocketChannel.socket().bind(socketAddress);
serverSocketChannel.register(selector, serverSocketChannel.validOps());
try {
while (selector.select() > -1) {
Iterator<SelectionKey> selectionKeyIterator = selector.selectedKeys().iterator();
while (selectionKeyIterator.hasNext()) {
SelectionKey selectionKey = selectionKeyIterator.next();
selectionKeyIterator.remove();
if (selectionKey.isValid()) {
if (!handleSelectionKey(selectionKey)) {
logger.debug("Unhandled selection key: " + selectionKey.hashCode() + ", " + selectionKey.readyOps());
}
}
}
}
}
catch (IOException e) {
e.printStackTrace();
}
Все по секретным документам с хабра =) Пришел новый клиент - обработали isAcceptable.
Проблема с клиентской частью. Допустим я хочу иметь возможность подключаться к нескольким сокетам и обрабатывать их в одном потоке.
Запускаю в одном потоке:
while (selector.select() > -1)
SocketChannel socketChannel = SocketChannel.open();
socketChannel.configureBlocking(false);
socketChannel.connect(socketAddress);
socketChannel.register(selector, socketChannel.validOps());