Нитки могут работать нормально, но редко хорошо масштабируются для многих клиентов. Есть два простых способа и множество более сложных способов справиться с этим, вот какой-то псевдокод о том, как проще два обычно структурируются, чтобы дать вам обзор.
выберите()
Это вызов, чтобы проверить, какие разъемы есть новые клиенты или данные, ожидающие на них, типичная программа выглядит следующим образом.
server = socket(), bind(), listen()
while(run)
status = select(server)
if has new client
newclient = server.accept()
handle add client
if has new data
read and handle data
Это означает, ни один из потоков не требуется для работы с несколькими клиентами, но это не очень хорошо масштабируется либо если данные ручки займет много времени, то вы не будете читать новые данные или принимать новых клиентов, пока это не будет сделано ,
Async розетка
Это еще один способ обработки сокетов, который вроде забранных выше выбора. Вы просто настраиваете обратные вызовы для общих событий и позволяете структуре делать не очень тяжелый подъем.
function handleNewClient() { do stuff and then beginReceive(handleNewData) }
function handleNewData() { do stuff and then beginReceive(handleNewData) }
server = create, bind, listen etc
server.beginAddNewClientHandler(handleNewClient)
server.start()
Я думаю, что это должно масштабироваться лучше, если обработка данных занимает много времени. Какую обработку данных вы будете делать?
Попробуйте http://www.codeproject.com/Articles/83102/C-SocketAsyncEventArgs-High-Performance-Socket-Cod ... там есть миллион статей, если вы ищете 'async socket C#' .. . – atlaste
Есть сотни примеров, если вы входите в «введение в программирование сокетов C#». Кроме того, вы загружаете большое количество видеороликов на эту тему, если хотите. – MarcF