возможно ли посылать несколько потоков по одному сокету?
Да - хотя, в зависимости от реализации это может быть больше или меньше видимым. Сначала я уточню, откуда я иду:
- C # / .Net 3.5
- System.Net.Sockets.Socket
Общая видимость (т. Е. Требуемое управление) потоков и возникших головных болей будет напрямую зависеть от того, как реализован сокет (синхронно или асинхронно). Если вы идете по синхронному маршруту, то у вас много работы по ручному управлению подключением, отправкой и получением через несколько потоков. Я настоятельно рекомендую избегать этой реализации. Усилия по правильному и эффективному выполнению синхронных методов в поточной модели просто не стоят сравнимых усилий по реализации асинхронных методов.
Я реализовал асинхронный Tcp-сервер за меньшее время, чем мне потребовалось для реализации многопоточной синхронной версии. Async намного легче отладить - и если вы намерены использовать Tcp (мой любимый выбор), у вас действительно мало забот о потерянных сообщениях, пропущенных данных или чем-то еще.
будет ли чередование потоков или будет ли сокет блокироваться в первом потоке (при условии tcp)?
Мне пришлось исследовать чередующиеся потоки (из вики), чтобы убедиться, что я правильно понял то, что вы спрашиваете. Чтобы лучше понять чередование и смешанные сообщения , обратитесь к этим ссылкам в вики:
- Протокол обмена сообщениями в реальном времени
- Протокол управления передачей
В частности, мощность Tcp лучше всего описана в следующем разделе:
Из-за перегрузки сети, балансировки нагрузки на трафик или другого непредсказуемого поведения сети, IP-пакеты могут быть
потерян, продублирован или доставлен из строя. TCP обнаруживает эти проблемы, запрашивает повторную передачу потерянного
пакеты, переупорядочивает неупорядоченные пакеты и даже помогает минимизировать перегрузку сети, чтобы уменьшить
возникновение других проблем. Как только приемник TCP наконец собрал идеальную копию данных
первоначально переданный, он передает эту дейтаграмму в прикладную программу. Таким образом, TCP абстрагирует приложение
связь из основных сетевых деталей.
Это означает, что чередующиеся сообщения будут переупорядочены в соответствующие им сообщения , отправленные отправителем. Ожидается, что многопоточность участвует или будет участвовать в разработке механизма клиент-сервер Tcp, ориентированного на производительность - будь то с помощью асинхронных или синхронизирующих методов.
Чтобы сокет не блокировался, вы можете установить для его свойства Blocking
значение false
.
Надеюсь, это даст вам хорошую информацию для работы. Черт, я даже немного научился ...