Простейший исходник демонстрации отправки и приема сообщений по протоколу UDP. По сравнению с протоколом TCP UDP намного проще и быстрее. UDP не требует постоянного соединения, не отправляет никаких вспомогательных сообщений и таким образом создает меньшую нагрузку на сеть. Плата за эти достоинства - ненадежность доставки сообщений. Но все-таки для многих целей использование протокола UDP вполне оправдано. Например, протокол UDP можно использовать для однонаправленных передач, широковещательных передач, групповых рассылок, вспомогательных сетевых задач, простых чатов по сети.Исходник написан на языке программирования C#, часть 1 исходника предназначена только для ознакомления с высокоуровневым классом UdpClient, не отвлекаясь на вспомогательные детали. Для отправки и извлечения сообщений используем блокирующие методы. Небольшие размеры отправляемых сообщений лишь на короткое время блокируют программу. Для приема сообщений не обойтись без дополнительного потока, иначе блокирование приложения может продолжаться все время работы программы.
// --- ИСХОДНЫЙ КОД ОТПРАВКИ СООБЩЕНИЙ --- // Отправка сообщения void SendMessage() { UdpClient udp = new UdpClient(); // Указываем адрес отправки сообщения IPAddress ipaddress = IPAddress.Parse(textBoxAddress.Text); IPEndPoint ipendpoint = new IPEndPoint(ipaddress, 15000); // Формирование оправляемого сообщения и его отправка. // Сеть "понимает" только поток байтов и ей безраличны // объекты классов, строки и т.п. Поэтому преобразуем текстовое /// сообщение в поток байтов. byte[] message = Encoding.Default.GetBytes(textBoxSend.Text); int sended = udp.Send(message, message.Length, ipendpoint); // Если количество переданных байтов и предназначенных для // отправки совпадают, то 99,9% вероятности, что они доберутся // до адресата. if(sended == message.Length) { // все в порядке textBoxSend.Text = ""; } // После окончания попытки отправки закрываем UDP соединение, // и освобождаем занятые объектом UdpClient ресурсы. udp.Close(); } // --- ИСХОДНЫЙ КОД ИЗВЛЕЧЕНИЯ СООБЩЕНИЙ --- // Запуск отдельного потока для приема сообщений void StartReceive() { rec = new Thread(new ThreadStart(Receive)); rec.Start(); } // Функция извлекающая пришедшие сообщения // работающая в отдельном потоке. void Receive() { // При принудительном завершении работы метода // класса UdpClient Receive() и непредвиденных ситуациях // возможны исключения в этом месте исходного кода, // заключим его в блок try чтобы не появлялись окна ошибок. try { // Перед созданием нового объекта закрываем старый // для освобождения занятых ресурсов. if (udp != null) udp.Close(); udp = new UdpClient(15000); while (true) { IPEndPoint ipendpoint = null; byte[] message = udp.Receive(ref ipendpoint); textBox2.Text = Encoding.Default.GetString(message); // Если дана команда остановить поток, останавливаем бесконечный цикл. if (stopReceive == true) break; } udp.Close(); } catch { } } // Функция безопасной остановки дополнительного потока void StopReceive() { // Останавливаем цикл в дополнительном потоке stopReceive = true; // Принудительно закрываем объект класса UdpClient if(udp != null) udp.Close(); // Для корректного завершения дополнительного потока // подключаем его к основному потоку. if(rec != null) rec.Join(); }
Исходник создан в среде программирования MS Visual Studio 2010 Express. Windows XP и выше. Framework 4.0.
| Файл исходника | Количество загрузок | Размер |
| Файлы рабочих исходников UDP | 756 | 38 КБ |
| << Исходный код отправки и извлечения сообщений по протоколу UDP (часть 2) | вверх | Исходный код программы-таймера рабочего времени на компьютере TimeWork1.0 >> |
