OutputStream объединяет сообщения, не работает flush(), socket обмен данными

Мне нужно передавать одиночные сообщения на сервер через сокеты, но они объединяются, flush() не работает, client.setTcpNoDelay(true) ничего не меняет. Пробовал даже ограничивать размер буфера, так как все сообщения не будут большими, но, насколько я понял, у советов есть ещё доп. буфер размером в ~100 байт.

Код тестовый, сейчас я просто пытаюсь решить данную проблему.

Клиент:

public class SocketClient {

    private BlockingQueue<String> queue = new ArrayBlockingQueue<String>(1024);
    private Socket client;

    public SocketClient() throws IOException {
        client = new Socket(InetAddress.getLoopbackAddress(), 1337);
        client.setTcpNoDelay(true);
        OutputStream out = client.getOutputStream();
        ipc.pool.execute(() -> {
            while (true) {
                try {
                    String msg = queue.take();
                    out.write((msg + " sent at " + System.currentTimeMillis()).getBytes(StandardCharsets.UTF_8));
                } catch (InterruptedException | IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }
    public void addMsg(String msg) {
        queue.add(msg);
    }
}

Дополнение: Если после метода out.write() добавить Thread.Sleep(0, 1) - Всё работает как нужно, но мне кажется это костылём. Да и засыпает он не на 1 наносекунду, а на 2мс (как-будто, так как отправляются сообщения именно с периодичностью 2мс), или это просто задержка передачи самих сокетов.

Сервер:

public class SocketServer {

    private ServerSocket server;

    public SocketServer() throws IOException {
        server = new ServerSocket(1337, 2, InetAddress.getLoopbackAddress());
        ipc.pool.execute(() -> {
            while (true) {
                try {
                    Socket socket = server.accept();
                    socket.setTcpNoDelay(true);
                    socket.setReceiveBufferSize(1024);
                    socket.setSendBufferSize(1024);
                    InputStream in = socket.getInputStream();
                    ipc.pool.execute(() -> {
                        while (true) {
                            try {
                                byte[] buff = new byte[1024];
                                int i = in.read(buff);
                                ipc.pool.execute(() -> {
                                    System.out.println(new String(buff, 0, i, StandardCharsets.UTF_8));
                                });
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    });
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

Вызов:

public static void main(String[] args) throws IOException {
    new SocketServer();
    SocketClient client = new SocketClient();
    pool.execute(() -> {
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        client.addMsg("Test1");
        client.addMsg("Test2");
        client.addMsg("Test3");
        client.addMsg("Test4");
        client.addMsg("Test5");
        client.addMsg("Test6");
    });
}

Вывод:

Test1 sent at 1625998000198
Test2 sent at 1625998000207Test3 sent at 1625998000207Test4 sent at 1625998000207Test5 sent at 1625998000207Test6 sent at 1625998000208

Нужен вывод:

Test1 sent at 1625998000198
Test2 sent at 1625998000207
Test3 sent at 1625998000207
Test4 sent at 1625998000207
Test5 sent at 1625998000207
Test6 sent at 1625998000208

Ответы (0 шт):