2013-11-12 3 views
1

Попытка получить работу сокетов Java. Вопрос в следующем: что вы можете делать одновременно, если используете Java API сокетов, и что происходит, если мы отправляем и читаем данные с некоторой задержкой?Проблемы с синхронизацией с сокетами Java I/O

  1. READ & НАПИШИТЕ сразу. Если один сокет-клиент подключен к одному серверу spetch, могут ли они одновременно читать и писать? Насколько я понимаю, протокол TCP является полнодуплексным, поэтому теоретически сокет должен уметь читать и писать на одном, но мы должны создать два потока для бот-клиента и сервера. Я прав?

  2. ЗАПИСЬ НА N клиентов одновременно. Если несколько сокетов-клиентов, подключенных к одному сокет-серверу, могут ли сервер читать несколько клиентов в один момент, может ли сервер сразу написать нескольким клиентам? Если максимально возможная физическая скорость сети NetworkCard составляет 1 кбайт/с и подключено 5 клиентов, с какой скоростью можно писать один клиент?

  3. Как я могу реализовать последовательную отправку данных в обоих направлениях? Я имею в виду, что я хочу отправить N байтов от сервера к клиенту, затем M байтов от клиента к серверу, затем N от сервера к клиенту и т. Д. Проблема в том, что какая-либо из двух сторон что-то написала на канале, другая сторона остановится считывая эти данные (read() == -1), только если канал закрыт, что означает, что мы не можем его повторно использовать и должны открыть другое соединение. Или, может быть, мы должны поместить читателей и писателей в разные темы, которые выполняют свою работу с read() и write(), пока соединение не будет закрыто?

  4. Представьте, что у нас есть задержка между вызовом write(); flush() с одной стороны и вызов read() с другой стороны. Во время задержки - где будут храниться письменные данные? Будет ли оно передано? Каков максимальный размер этих «задержанных» данных для хранения где-то «между»?

+0

Надеюсь, вы найдете того, кто может ответить на ваш вопрос. Из-за его объема потребуется много времени. В двух словах вы спрашиваете о параллелизме потоков (помните, что один поток может делать только одну вещь за раз), а также то, как «Socket» ведет себя в определенных случаях, зависящих от платформы. Я слишком ленив, чтобы написать все. :) – MadConan

+0

Еще спасибо за попытку, MadConan. Конечно, я сам найду информацию о параллелизме, но можете ли вы порекомендовать что-то прочитать о Java-сети? – KutaBeach

ответ

1
  1. Correct. Если вы используете блокирующий ввод-вывод, для каждого соединения Socket потребуется поток считывателя и поток писем.

  2. Вы можете использовать один поток для записи на N клиентов одновременно, но вы рискуете блокировать запись. Я не буду говорить о скорости записи здесь, поскольку это будет зависеть от нескольких вещей, но, очевидно, совокупная скорость записи для всех клиентов будет меньше 1 кбит/с.

  3. Да, вам понадобятся 2 потока, вы не сможете сделать это с помощью одного потока (или можете, но, как вы сказали сами, вам нужно будет постоянно открывать и закрывать соединения).

  4. Он хранится где-то в буфере. В зависимости от вашего кода он может быть в буферизованном потоке или в собственном буфере сокета. Я считаю, что размер буфера по умолчанию BufferedOutputStream составляет 8K, а собственный буфер сокета будет зависеть от среды. Это не должно иметь особого значения, но потоковое качество TCP/IP устраняет необходимость думать о буферах, если вам действительно не нужно делать точную настройку.

Смежные вопросы