Сокеты позволяют связываться с удаленным компьютером и обмениваться с ним данными, используя либо дейтаграммный протокол (UDP), либо протокол управления передачей (TCP). Оба протокола могут быть использованы чтобы создавать как клиентские, так и серверные приложения. Возможные применения сокетов:
Для ознакомления с принципами программирования сокетов можно просмотреть следующий материал.
При использовании сокетов прежде всего необходимо определиться с тем какой протокол использовать - TCP или UDP. Основные отличия между ними имеют место в состоянии соединения.
TCP протокол является протоколом основанным на соединении, аналогично телефонной линии - прежде чем обмениваться данными, пользователь должен установить соединение.
UDP протокол является протоколом без соединения и обмен данными между двумя компьютерами подобен посылке сообщения: один компьютер посылает сообщение другому не устанавливая при этом какого-либо соединения.
Создавая приложение, использующее TCP протокол, вы прежде всего должны решить будет ли ваше приложение сервером или клиентом. Создание сервера означает, что ваше приложение должно "прослушивать" назначенный ему порт. Когда клиент посылает запрос связи, сервер может принять запрос и таким образом установить соединение. Как только соединение установлено, клиент и сервер могут свободно обмениваться сообщениями друг с другом.
Следующая программа представляет собой один из вариантов реализации простого UDP-приемника. Запишите код в файл с именем SimpleUdpSrvr.cs и скомпилируйте его, чтобы получить файл с тем же именем, но с расширением exe, т. е. работающее приложение.
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
class SimpleUdpSrvr
{
public static void Main()
{
int recv;
byte[] data = new byte[1024];
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);
Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
newsock.Bind(ipep);
Console.WriteLine("Waiting for a client...");
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint Remote = (EndPoint)(sender);
recv = newsock.ReceiveFrom(data, ref Remote);
Console.WriteLine("Message received from {0}:", Remote.ToString());
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
string welcome = "Welcome to my test server";
data = Encoding.ASCII.GetBytes(welcome);
newsock.SendTo(data, data.Length, SocketFlags.None, Remote);
while(true)
{
data = new byte[1024];
recv = newsock.ReceiveFrom(data, ref Remote);
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
newsock.SendTo(data, recv, SocketFlags.None, Remote);
}
}
}
Чтобы запустить UDP-приемник, откройте окно командной строки и введите команду SimpleUdpSrvr. В результате должно появиться следующее сообщение
C:\>SimpleUdpSrvr Waiting for a client...
Чтобы проверить работу UDP-приемника необходимо запустить программу UDP-передатчика.
Для работы в паре с UDP-приемником создайте простой UDP-передатчик. Создайте новый файл с именем SimpleUdpClient.cs и запишите в него следующий код.
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
class SimpleUdpClient
{
public static void Main()
{
byte[] data = new byte[1024];
string input, stringData;
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050);
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
string welcome = "Hello, are you there?";
data = Encoding.ASCII.GetBytes(welcome);
server.SendTo(data, data.Length, SocketFlags.None, ipep);
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint Remote = (EndPoint)sender;
data = new byte[1024];
int recv = server.ReceiveFrom(data, ref Remote);
Console.WriteLine("Message received from {0}:", Remote.ToString());
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
while(true)
{
input = Console.ReadLine();
if (input == "exit")
break;
server.SendTo(Encoding.ASCII.GetBytes(input), Remote);
data = new byte[1024];
recv = server.ReceiveFrom(data, ref Remote);
stringData = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine(stringData);
}
Console.WriteLine("Stopping client");
server.Close();
}
}
Чтобы проверить совместную работу UDP-передатчика и UDP-приемника, необходимо сначала в окне командной строки запустить UDP-приемник, после чего в другом консольном окне запустить UDP-передатчик.