правильный способ отправки строк с помощью Java-сокета с использованием Java NIO - PullRequest
0 голосов
/ 09 ноября 2019

Ситуация такова, что у меня есть сервер, который прослушивает соединения и использует селектор, клиент подключается и отправляет строку, сервер получает ее и отправляет другую строку клиенту, после чего клиент завершается.

Сервер правильно принимает строку, отправленную клиентом, и отправляет ее строку, но в этот момент клиент входит в бесконечный цикл, выполняет read (), но это так, как если бы он не мог взять данные из буфера, фактическиСтрока всегда пуста, как я могу это сделать?

Код сервера

ByteBuffer buf = ByteBuffer.allocate(1024);                         
buf.rewind();
StringBuilder tmp = new StringBuilder();
while(client.read(buf)>0) {                         
    buf.flip();
    while(buf.hasRemaining()) {
        tmp.append((char) buf.get());
    }
    buf.clear();
}
System.out.println("String received " + tmp.getBytes());                    
String string = "hello"

buf.rewind();
buf.put(string.getBytes());
while(buf.hasRemaining()) {
    client.write(buf);
}
buf.clear();
System.out.println("Sending complete.");

Код клиента

ByteBuffer buf = ByteBuffer.allocate(1024);
buf.put(message.getBytes());            
buf.flip();
while(buf.hasRemaining()) {
    socket.write(buf);
}
buf.clear();
StringBuilder string = new StringBuilder();
buf.rewind();
while(socket.read(buf)>0){
    //the client read something cause execute these commands
    buf.flip();
    while(buf.hasRemaining()) {
        //then enter in this infinite loop
        string.append((char) buf.get());
        //It only prints "Read: " no sing of the rest of the string
        System.out.println("Read: " +string.toString());
    }
    buf.clear();                    
}
System.out.println("Client has received: " + string.toString());
...