Итак, пишу простой сервер на стандартной библиотеке java.nio.
Возникли следующие проблемы:
1) Буффер не чиститься вообще. Т.е. информация остается, что делает работу приложения не возможной.
2) Сервер будет малонагруженный, для управления системой умный дом. Т.к. сервак обладает только одним физическим портом для подключение ко внешней перефирии. То возникает вопрос, как можно ограничить с классом, отвечающий за коммуникацию несколькими клиентами?
3) Когда клиент отключается от сервера. Сервер начинает хаотично выводить данные из буффера. Т.е. ведет себя так, будто клиент не отключался и выводит информацию из буффера снова и снова.
Сам код:
import java.io.IOException;
import java.net.InetSocketAddress;
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.nio.charset.Charset;
import java.util.Iterator;
import java.util.Objects;
import java.util.Set;
public class Server {
public static void main (String [] args) throws IOException{
Selector selector = Selector.open(); // Открываем селектор.
ServerSocketChannel serverSocket = ServerSocketChannel.open(); // Открываем канал.
serverSocket.bind(new InetSocketAddress(4321)); // Связываем розетку с данным айпи и портом.
serverSocket.configureBlocking(false); // Переводим в не блокировочный режим.
serverSocket.register(selector, SelectionKey.OP_ACCEPT); // регистрируем селектор и устанавливливаем в режим ожидание клиента.
ByteBuffer buffer = ByteBuffer.allocate(256); // Выделяем 256 байт под буффер.
while (true) {
selector.select(); // Создаем список.
Set <SelectionKey> selectedKey = selector.selectedKeys(); // Передаем список ключей.
Iterator <SelectionKey> iter = selectedKey.iterator(); // создаем итератор.
while (iter.hasNext()) {
SelectionKey key = iter.next(); // Получаем ключ к каналу.
if (key.isAcceptable()) {
register(selector, serverSocket);
}
if (key.isReadable()) {
reader (buffer, key);
}
iter.remove();
}
}
}
private static void register (final Selector selector, final ServerSocketChannel serverSocket) throws IOException {
assert !Objects.isNull(selector) && !Objects.isNull(serverSocket);
SocketChannel client = serverSocket.accept(); // Подключаем нового пользователя.
client.configureBlocking(false); // Переводим в блокировочный режим.
client.register(selector, SelectionKey.OP_READ); // Регестрируем клиента, режим чтения.
}
private static void reader (final ByteBuffer buffer, final SelectionKey key) throws IOException {
assert !Objects.isNull(buffer) && Objects.isNull(key);
SocketChannel client = (SocketChannel) key.channel(); // Получаем канал.
client.read(buffer); // Записываем значение в буффер.
String messageFromClient = new String(buffer.array()).trim();
System.out.println(messageFromClient);
buffer.flip();
client.write(buffer);
buffer.clear();
}
}