#java #networking #tcp
#java #сеть #tcp
Вопрос:
Я пишу небольшую вещь для назначения, и мне нужно управлять TCP-соединениями между хостами. Изначально моим видением было два TCP-соединения, одно входящее, одно исходящее, и действительно сложный протокол для управления созданием и уничтожением этих соединений.
Итак, вот более простая альтернатива, которая, я надеюсь, сработает. Один сокет, легко подключаемый, легко уничтожаемый. Один поток записывает данные в поток на этом сокете, другой поток считывает из потока на том же сокете. У меня нет проблем с блокировкой, поэтому мне не нужно использовать nio для чего-либо.
Могу ли я это сделать?
Комментарии:
1. Да, конечно, вы можете, если это то, что вы хотите.
Ответ №1:
TCP сокет — это полнодуплексный поток, вы можете читать из него и записывать в него из нескольких потоков. Хорошая ли это идея — это совершенно другой вопрос.
Комментарии:
1. Почему это должно быть сомнительной идеей?
2. Я не говорил, что это «сомнительная идея». Все зависит от контекста. Просто в наши дни дети так убеждены, что все должно делаться с помощью потоков 🙂
3. Просто чтобы быть более точным: наличие двух отдельных потоков, из которых один выполняет только чтение, а другой — только запись в один и тот же сокет, полностью безопасно?
Ответ №2:
Вероятно, это привело бы к более четкому и простому коду, если бы у вас был только поток записи и только один поток чтения.
Другие потоки, желающие взаимодействовать через этот сокет, будут передавать запросы потоку записи через некоторую очередь. Аналогично, считыватель будет отправлять входящие сообщения соответствующим потокам через очередь.
Этот метод обычно используется для пользовательских интерфейсов.
Ответ №3:
Насколько я знаю, сокеты потокобезопасны. Вы должны быть осторожны только при вызове close () в сокете из одного потока. Второй может зависать на какой-то блокирующей функции или выбирать бесконечно.
Ответ №4:
Да, вы можете это сделать. У вас может быть 1 поток, запускающий сервер с помощью ServerSocket, и другой поток, подключающийся к этому серверу через сокет. Вы можете найти в Google множество примеров для EchoServer / EchoClient, чтобы начать.