#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. Вам нужен способ связи с адресатом, когда начинается и заканчивается фрагмент данных. Один из вариантов — отправить размер заранее. Другим вариантом является отправка завершающего значения в конце. В принципе, вам нужен протокол, понятный как серверу, так и клиенту.