Пример приложения UDP
147C# и .NET --- Сетевое программирование --- Пример приложения UDP
Чтобы проиллюстрировать работу с UDP, разработаем простое диалоговое приложение на языке C#, использующее класс UdpClient. Диалоговое приложение использует отдельный поток, чтобы слушать сообщения от удаленных хостов.
Это приложение разделено на три логические части. В первой части пользователю предлагается ввести информацию о локальных и удаленных портах и удаленном IP-адресе, которые он хочет использовать. Например, порт 5001 используется как отправляющий порт для хоста А и как приемный порт для хоста В, для порта 5002 все наоборот.
Во второй части приложение слушает входящие данные от удаленного хоста. Как обсуждалось ранее, метод Receive() проверяет наличие входящих дейтаграмм и блокирует поток, пока от удаленного хоста не поступит сообщение. Чтобы отделить этот процесс от основной последовательности действий, создается новый поток.
Третий логический блок в приложении принимает данные, введенные пользователем, и отправляет их указанному удаленному порту. Он выполняется на основном потоке, пока рабочий поток продолжает слушать входящие данные.
Ниже приведен полный код программы, реализующей простой чат:
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
namespace UdpSample
{
class Chat
{
private static IPAddress remoteIPAddress;
private static int remotePort;
private static int localPort;
[STAThread]
static void Main(string[] args)
{
try
{
// Получаем данные, необходимые для соединения
Console.WriteLine("Укажите локальный порт");
localPort = Convert.ToInt16(Console.ReadLine());
Console.WriteLine("Укажите удаленный порт");
remotePort = Convert.ToInt16(Console.ReadLine());
Console.WriteLine("Укажите удаленный IP-адрес");
remoteIPAddress = IPAddress.Parse(Console.ReadLine());
// Создаем поток для прослушивания
Thread tRec = new Thread(new ThreadStart(Receiver));
tRec.Start();
while (true)
{
Send(Console.ReadLine());
}
}
catch (Exception ex)
{
Console.WriteLine("Возникло исключение: " + ex.ToString() + "\n " + ex.Message);
}
}
private static void Send(string datagram)
{
// Создаем UdpClient
UdpClient sender = new UdpClient();
// Создаем endPoint по информации об удаленном хосте
IPEndPoint endPoint = new IPEndPoint(remoteIPAddress, remotePort);
try
{
// Преобразуем данные в массив байтов
byte[] bytes = Encoding.UTF8.GetBytes(datagram);
// Отправляем данные
sender.Send(bytes, bytes.Length, endPoint);
}
catch (Exception ex)
{
Console.WriteLine("Возникло исключение: " + ex.ToString() + "\n " + ex.Message);
}
finally
{
// Закрыть соединение
sender.Close();
}
}
public static void Receiver()
{
// Создаем UdpClient для чтения входящих данных
UdpClient receivingUdpClient = new UdpClient(localPort);
IPEndPoint RemoteIpEndPoint = null;
try
{
Console.WriteLine(
"\n-----------*******Общий чат*******-----------");
while (true)
{
// Ожидание дейтаграммы
byte[] receiveBytes = receivingUdpClient.Receive(
ref RemoteIpEndPoint);
// Преобразуем и отображаем данные
string returnData = Encoding.UTF8.GetString(receiveBytes);
Console.WriteLine(" --> " + returnData.ToString());
}
}
catch (Exception ex)
{
Console.WriteLine("Возникло исключение: " + ex.ToString() + "\n " + ex.Message);
}
}
}
}
Ниже показан результат взаимодействия двух клиентов: