Вы этого не показали, но я предполагаю, что у вас есть вторая реализация, использующая TCPServer
для эквивалента netcat -l
.
Вам нужно использовать отдельные волокна для чтения / записи в сокет и канал. Немного сложно судить, что именно происходит, не видя сервер, но я полагаю, что вы попадаете в тупик, когда обе стороны ждут ввода другой стороны или пользователя, но не могут приступить к фактической отправке или чтению чего-либо. Другими словами, вы заблокировали часть отправки / получения, требуя, чтобы другая сторона тщательно реагировала и взаимодействовала, чтобы не блокировать клиента. Очевидно, что это хрупкий подход.
Вместо этого вы должны убедиться, что какое-либо волокно не выполняет более одной операции в al oop. Один получает из сокета и пересылает его в канал, второй получает из канала и пересылает его в сокет, третий получает из бокового канала считывателя и печатает или делает все, что вы хотите, данные и последний заполняет канал отправителя. Таким образом, ни одна операция не может заблокировать одно из других. Конечно, одно из этих волокон должно быть просто основным программным.
На сервере вам дополнительно понадобится одно волокно, которое принимает клиентские соединения и порождает циклы отправителя и получателя для каждого.
Наконец обратите внимание, что оператор select
с одной ветвью when
не имеет никакого эффекта, вы можете сделать вызов напрямую. select
полезно, если вам нужно читать или записывать одновременно несколько каналов в одном и том же волокне, поэтому, например, если у вас будет несколько каналов, предоставляющих данные для отправки в сокет, вы должны использовать select
, чтобы не иметь сообщения могут быть повреждены двумя волокнами, одновременно записывающими в один и тот же сокет. Дополнительным вариантом использования select
является отправка или получение из канала с тайм-аутом.