Люди смущены вашим вопросом, и поэтому половина говорит: «Да, но это не так, как два потока должны общаться друг с другом», а другой интерпретирует ваш вопрос как «Я хочу, чтобы один поток всегда записывал в сокет»и другой поток всегда читает данные из сокета, поэтому моя программа может отправлять и получать одновременно. "Более поздняя интерпретация означает, что эти два потока НЕ используют сокет для обмена информацией друг с другом, но другой механизм, который делает это менее неприглядным.Ответ ДА.Сокеты являются двунаправленными, поэтому вы можете отправлять и получать данные одновременно.Это не значит, что для этого нужно использовать два потока.
Теперь это очень необычно.За все время, что я работал над протоколами сокетов (POP, IMAP, HTTP и т. Д.), Я никогда не сталкивался с ситуацией, когда это было так, или, говоря иначе, я никогда не видел протокол, который требует этого,В какой-то момент протокол является синхронным, и один из этих концов должен ждать, прежде чем он отправит дополнительную информацию или прочитает дополнительную информацию.Единственный случай, о котором я мог подумать, это что-то вроде RTMP, аудио или потокового видео.Тем не менее, я думаю, что большинство из них используют некую форму неблокирующего ввода / вывода, поэтому имитируют одновременную связь.
И это следующее, что вы можете рассмотреть.Когда вы обрабатываете сообщения из сокета, вы можете проверить сокет на наличие данных, прежде чем блокировать его.Если он там есть, прочитайте его, если у вас есть данные для записи, проверьте и можете ли вы писать без блокировки, а затем запишите это.Или используйте неблокирующие сокеты IO.Таким образом, у вас есть только один поток для чтения / записи в сокет, и синхронизация между операциями чтения / записи не составляет труда.С потоками вам придется использовать блокировку или семафоры или что-то другое для координации между ними, что может привести к мертвым блокировкам.