Вопрос по sockets, java – OutputStream в Java блокируется? (Розетки)

10

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

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

После того, как я обдумала этот вопрос, у меня возник вопрос, является ли OutputStream Java-сокета на самом деле ставит в очередь то, что он хочет отправить самостоятельно, что исключает необходимость очереди заранее. Возможность возникновения интенсивных проблем возникает только тогда, когда Сервер блокирует, если он не получает ответ от клиента о том, что отправленный объект был получен.

Благодарю.

Error: User Rate Limit Exceeded Zimm3r

Ваш Ответ

3   ответа
9

Error: User Rate Limit Exceeded

В Java это проявляется как блокировка записи вOutputStream, Базовый стек / операционная система TCP / IP не позволяет отправлять больше данных, пока клиент не будет готов их получить.

Вы можете легко проверить это! Я реализовал простой сервер, который принимает соединение, но не может прочитать входящие данные:

new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            final ServerSocket serverSocket = new ServerSocket(4444);
            final Socket clientSocket = serverSocket.accept();
            final InputStream inputStream = clientSocket.getInputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}).start();

И простой клиент, который просто отправляет как можно больше данных в пакетах 4K:

final Socket client = new Socket("localhost", 4444);
final OutputStream outputStream = client.getOutputStream();
int packet = 0;
while(true) {
    System.out.println(++packet);
    outputStream.write(new byte[1024 * 4]);
}

Клиентский цикл зависает на моем компьютере после 95 итераций (ваш пробег может отличаться). Однако, если я читаю изinputStream в серверном потоке - цикл продолжается и продолжается.

Error: User Rate Limit Exceeded
4

setSendBufferSize() метод для установки этого размера буфера. Если ваша запись может быть кэширована в этом буфере, то, конечно, вы можете выполнить итерацию немедленно в следующем сокете. В противном случае этот буфер должен быть немедленно сброшен клиенту. Итак, во время промывки вы будете заблокированы. Если вы хотите избежать блокировки при очистке буфера, вы должны использоватьSocketChannel

Error: User Rate Limit Exceeded salbeira
Error: User Rate Limit Exceeded
0

Похожие вопросы