Как отправить строку через неблокирующий socketchannel

#java #socketchannel

#java #socketchannel

Вопрос:

У меня возникла проблема с 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())
        }
    }
}
  

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

Кто-нибудь может мне помочь?

Комментарии:

1. преобразуйте строку Json в `ByteBuffer` и вызовите SocketChannel.write метод для отправки, чтобы попробовать это?

2. @TongChen проблема в том, что я априори не знаю, сколько записей я должен выполнить

3. Предположим, что длина строки Json равна 245, а емкость вашего байтбуфера равна 100, вам нужно отправить три раза. Клиенту и серверу необходимо выполнить некоторую работу, объединить три части строки в одну. Я понимаю, что вы имеете в виду?

4. Да, вы правы, но сервер не знает, что он должен получить 245 байт. На самом деле, мой первоначальный вопрос был, могу ли я отправить строку, не отправляя размер строки раньше

5. Вам нужен способ связи с адресатом, когда начинается и заканчивается фрагмент данных. Один из вариантов — отправить размер заранее. Другим вариантом является отправка завершающего значения в конце. В принципе, вам нужен протокол, понятный как серверу, так и клиенту.