Могу ли я читать и писать в одном сокете, используя два разных потока? - PullRequest
9 голосов
/ 15 апреля 2011

Я пишу небольшую вещь для назначения, и мне нужно управлять TCP-соединениями между хостами.Моим видением было изначально два TCP-соединения, одно входящее, одно исходящее и действительно сложный протокол для управления созданием и уничтожением этих соединений.

Итак, вот более простая альтернатива, которая, я надеюсь, сработает.Одна розетка, легко подключается, легко разрушается.Один поток записывает данные в поток в этом сокете, один поток читает из потока в том же сокете.У меня нет проблем с блокировкой, поэтому мне не нужно ни для чего использовать nio.

Могу ли я сделать это?

Ответы [ 4 ]

10 голосов
/ 15 апреля 2011

TCP-сокет является полнодуплексным потоком, вы можете читать и записывать в него из нескольких потоков.Является ли это хорошей идеей - это совершенно другой вопрос.

5 голосов
/ 15 апреля 2011

Вероятно, это приведет к более ясному и простому коду, если у вас будет только поток записи и только один поток чтения.

Другие потоки, желающие связаться через этот сокет, будут передавать запросы в поток записи через некоторую очередь. Аналогично, читатель будет отправлять входящие сообщения в соответствующие потоки через очередь.

Этот метод обычно используется для пользовательских интерфейсов.

2 голосов
/ 15 апреля 2011

Да, вы можете сделать это. Вы можете иметь 1 поток, запускающий сервер, используя ServerSocket , и другой поток, подключающийся к этому Серверу через Socket . Вы можете найти множество примеров для EchoServer / EchoClient, чтобы начать.

2 голосов
/ 15 апреля 2011

Насколько я знаю, сокеты являются поточно-ориентированными.Вы должны быть осторожны, только когда вызываете close () для сокета из одного потока.Второй может зависнуть на какой-либо функции блокировки или выбрать бесконечно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...