Исходник программы отправки и приема сообщений по протоколу UDP. К сведению, протокол - это стандарт, правила отправки и получения сообщений. По сравнению с протоколом TCPUDP проще и быстрее. Протокол UDP не требует постоянного соединения, не отправляет вспомогательных сообщений и таким образом создает меньшую нагрузку на сеть. Но плата за эти достоинства - ненадежность доставки сообщений. И все-таки для многих целей использование UDP вполне оправдано. UDP можно использовать для однонаправленных передач, широкого вещания в сети, групповых рассылок, поиска родственных программ в сети.
Исходник написан на языке программирования C#, первая часть исходника предназначена для ознакомления с высокоуровневым классом 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 sent = udp.Send(message, message.Length, ipendpoint);
// Если количество переданных байтов и предназначенных для
// отправки совпадают, то 99,9% вероятности, что они доберутся
// до адресата.
If (sent == 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 2012 .NET, Framework 4.0.