Как отправить строку через неблокирующий сокет канал - PullRequest
0 голосов
/ 11 марта 2019

У меня проблема с SocketChannel в клиент-серверном Java-приложении.

На сервере, прежде всего, я инициализирую селектор:

Selector selector = null;
try{
    ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
    serverSocketChannel.socket().bind(new InetSocketAddress(5000));
    serverSocketChannel.configureBlocking(false);

    selector = Selector.open();
    serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
} catch(IOException e){
    e.printStackTrace();
    return;
}

А потом я начинаю некоторое время:

while(true) {
    try {
        selector.select();
    } catch (IOException ex) {
        ex.printStackTrace();
        break;
    }
    Set<SelectionKey> readyKeys = selector.selectedKeys();
    Iterator<SelectionKey> iterator = readyKeys.iterator();
    while (iterator.hasNext()) {
        SelectionKey key = iterator.next();
        iterator.remove();
        try {
            if (key.isAcceptable()) {
                ServerSocketChannel server = (ServerSocketChannel) key.channel();
                SocketChannel clientChannel = server.accept();
                clientChannel.configureBlocking(false);
                clientChannel.register(selector, SelectionKey.OP_READ);
            } else if (key.isReadable()) {
                readFunction((SocketChannel)key.channel())
        }
    }
}

Теперь я должен разработать функцию чтения. Я хотел бы передавать данные между клиентом и сервером с помощью строки (Json), но поскольку они не блокируются, я не знаю, смогу ли я это сделать, не отправив размер строки перед строкой.

Может ли кто-нибудь мне помочь?

...