Итак, я пытаюсь написать программу, которая принимает java nio SocketChannel Connections, но также сохраняет их открытыми. Допустим, Клиент отправляет сообщение, и если Сервер немедленно отправит то же сообщение обратно (Simple Echo Server), но процесс ответа не будет работать, если Клиент отправит новое сообщение, Сервер не ответит, пока я не закрою сокетный канал Клиента. , Но после того, как я закрыл канал Клиента, все отправленные ранее сообщения будут приходить сразу. (Извините за мой ломаный английский, это не мой родной язык)
Процесс записи используется на стороне сервера и клиента.
Процесс написания:
try {
final ByteBuffer byteBuffer = ByteBuffer.wrap(data);
while(byteBuffer.hasRemaining()){
socketChannel.write(byteBuffer);
}
byteBuffer.flip();
} catch (IOException exception) {
throw new BloumException(exception.getMessage());
}
Процесс чтения:
final ByteBuffer byteBuffer = ByteBuffer.allocate(DefaultConnectionCreator.this.getDefaultBufferSize());
try {
while(socketChannel.read(byteBuffer) != -1){
//byteBuffer.clear();
}
} catch (IOException exception) {
exception.printStackTrace();
throw new BloumException(exception.getMessage());
}
return byteBuffer.array();
Процесс выбора ключа (автоматическое закрытие возвращает false):
private void handleKeys(final ServerSocketChannel serverSocketChannel, Set<SelectionKey> keys, HashMap<SocketChannel, ByteBuilder> sessions) throws Exception{
final Iterator<SelectionKey> iterator = keys.iterator();
while(iterator.hasNext()){
final SelectionKey selectionKey = iterator.next();
iterator.remove();
if(selectionKey.isValid()){
if(selectionKey.isAcceptable()){
final ServerSocketChannel serverSocketChannel2 = (ServerSocketChannel)selectionKey.channel();
final SocketChannel socketChannel = serverSocketChannel2.accept();
socketChannel.configureBlocking(false);
socketChannel.register(selectionKey.selector(), SelectionKey.OP_READ);
sessions.put(socketChannel, new ByteBuilder());
}else if(selectionKey.isReadable()){
final SocketChannel socketChannel = (SocketChannel)selectionKey.channel();
final ByteBuffer byteBuffer = ByteBuffer.allocate(Connection.MAX_BUFFER_SIZE);
final Integer bytesRead = socketChannel.read(byteBuffer);
if(bytesRead!=-1){
byte[] data = new byte[bytesRead];
System.arraycopy(byteBuffer.array(), 0, data, 0, bytesRead);
Boolean autoClose = true;
if(ConnectionHost.this.handle(this.getConnectionCreator().createConnection(socketChannel), data)){
autoClose=true;
}else autoClose=false;
if(autoClose){
sessions.remove(socketChannel);
socketChannel.close();
}else{
if(!sessions.containsKey(socketChannel))sessions.put(socketChannel, new ByteBuilder());
}
}
}else throw new BloumException("The given key is not supported.");
}else throw new BloumException("The key is not valid anymore.");
}
}