Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[13.58.182.39] |
|
Сообщ.
#1
,
|
|
|
Здравствуйте!
Возможно такая тема уже есть, тогда простите. Стоит задача реализовать многопоточный сервер на C#. Допустим пока для обмена текстовыми сообщения. Написал однопоточный. Реализовал так: Запускай новый поток и в нем: Int32 port = 8812; IPAddress localAddr = IPAddress.Parse("127.0.0.1"); TcpListener server = new TcpListener(localAddr, port); server.Start(); После этого вхожу в цикл бесконечный для прослушивания запросов на подключение от клиентов. В нем после успешного соединения, включаю еще один фактически бесконечный цикл, для приема сообщений от конкретного соединения. После того как обрывается соединение - закрываю всю лавочку. while (true) { connection = server.AcceptSocket(); socketStream = new NetworkStream(connection); writer = new BinaryWriter(socketStream); reader = new BinaryReader(socketStream); AppendText(displayTextBox, "Соединение " + counter + " принято. \r\n"); writer.Write("SERVER>>> Connection successful"); inputTextBox.ReadOnly = false; string theReply = ""; //считывание строки данных от клиента do { try { //Считываем строку, отправленную на сервер theReply = reader.ReadString(); //Отображение сообщения AppendText(displayTextBox, "\r\n" + theReply); // displayTextBox.Text += "\r\n" + theReply; } //Обработка исключения при ошибке считывания данных catch (Exception) { break; } } while (theReply != "CLIENT>>> TERMINATE" && connection.Connected); AppendText(displayTextBox, "\r\nПользователь оборвал соединение"); SwitchButton(button1); //Шаг 5: Закрытие соединения writer.Close(); reader.Close(); socketStream.Close(); connection.Close(); ++counter; } Вопрос: Как правильно еще добавить потоки, что бы оптимально сделать сервер многопоточным? По идее, нужно выделить вложенный цикл который принимает сообщения в отдельный поток? do { .............................. } while (theReply != "CLIENT>>> TERMINATE" && connection.Connected); Но ведь при этом нужно для каждого нового соединения открывать новый поток? Это чисто ручками писать? Или есть инструменты которые допустим сразу регистрируют 10 потоков. (а не каждый по отдельности) и даллее уже мы просто включаем их и выключаем? Есть ли вообще способы упрощения всего? Допустим, что бы потом можно было лишь использованием какой либо функции встроенной библиотеки пересылать файл по сети и т.д. С Ув. Сергей! |
Сообщ.
#2
,
|
|
|
Не уверен, поскольку не знаю какие задачи стоят перед Вашим сервером, но
возможно Вам поможет System.Threading.ThreadPool. Как видно из названия это его предназначение держать пул потоков. |
Сообщ.
#3
,
|
|
|
Вот статья поможет тебе http://www.microsoft.com/Rus/Msdn/Magazine/2005/08/Winsock.mspx описан подход к написанию высокоскоростного многопоточного сокет сервера.
|
Сообщ.
#4
,
|
|
|
Спасибо за статью!
Можно еще один вопрос в догонку? Заталкиваю image в поток, а затем поток в byte[] data, таким образом: System.IO.MemoryStream stream = new System.IO.MemoryStream(); e.WebCamImage.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp); data = stream.ToArray(); Нужно произвести обратную операцию, из массива байтов, переписать в поток, а из потока в Image. Каким образом можно это сделать? P.S. Только разбираюсь с Шарпом. Пока с ним на Вы. |
Сообщ.
#5
,
|
|
|
Byte[] data; //... MemoryStream ms = new memoryStream(data); У Image есть то ли конструктор то ли стат. метод, который создаёт его из потока. Там распознаётся формат картинки, размери и т.п. |