Сокеты позволяют связываться с удаленным компьютером и обмениваться с ним данными, используя либо дейтаграммный протокол (UDP), либо протокол управления передачей (TCP). Оба протокола могут быть использованы чтобы создавать как клиентские, так и серверные приложения. Возможные применения сокетов:
Для ознакомления с принципами программирования сокетов можно просмотреть следующий материал.
При использовании сокетов прежде всего необходимо определиться с тем какой протокол использовать - TCP или UDP. Основные отличия между ними имеют место в состоянии соединения.
TCP протокол является протоколом основанным на соединении, аналогично телефонной линии - прежде чем обмениваться данными, пользователь должен установить соединение.
UDP протокол является протоколом без соединения и обмен данными между двумя компьютерами подобен посылке сообщения: один компьютер посылает сообщение другому не устанавливая при этом какого-либо соединения.
Создавая приложение, использующее TCP протокол, вы прежде всего должны решить будет ли ваше приложение сервером или клиентом. Создание сервера означает, что ваше приложение должно "прослушивать" назначенный ему порт. Когда клиент посылает запрос связи, сервер может принять запрос и таким образом установить соединение. Как только соединение установлено, клиент и сервер могут свободно обмениваться сообщениями друг с другом.
Следующая программа представляет собой один из вариантов реализации простого TCP-сервера. Запишите код в файл с именем SimpleTcpSrvr.cs и скомпилируйте его, чтобы получить файл с тем же именем, но с расширением exe, т. е. работающее приложение.
using System; using System.Net; using System.Net.Sockets; using System.Text; class SimpleTcpSrvr { 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.Stream, ProtocolType.Tcp); newsock.Bind(ipep); newsock.Listen(10); Console.WriteLine("Waiting for a client..."); Socket client = newsock.Accept(); IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint; Console.WriteLine("Connected with {0} at port {1}", clientep.Address, clientep.Port); string welcome = "Welcome to my test server"; data = Encoding.ASCII.GetBytes(welcome); client.Send(data, data.Length, SocketFlags.None); while(true) { data = new byte[1024]; recv = client.Receive(data); if (recv == 0) break; Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)); client.Send(data, recv, SocketFlags.None); } Console.WriteLine("Disconnected from {0}", clientep.Address); client.Close(); newsock.Close(); } }
Чтобы запустить TCP-сервер, откройте окно командной строки и введите команду SimpleTcpSrvr. В результате должно появиться следующее сообщение
C:\>SimpleTcpSrvr Waiting for a client...
Чтобы проверить работу сервера откройте второе окно командной строки и введите в нем команду
C:\>telnet 127.0.0.1 9050
После того как появится сообщение, что связь с сервером установлена, можно посылать сообщения, набирая символы с помощью клавиатуры. Поскольку сервер работает в режиме эхо, то набираемые символы в окне telnet будут дублироваться.
Для работы в паре с TCP-сервером создайте простой TCP-клиент. Создайте новый файл с именем SimpleTcpClient.cs и запишите в него следующий код.
using System; using System.Net; using System.Net.Sockets; using System.Text; class SimpleTcpClient { public static void Main() { byte[] data = new byte[1024]; string input, stringData; IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("192.168.0.38"), 9050); Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { server.Connect(ipep); } catch (SocketException e) { Console.WriteLine("Unable to connect to server."); Console.WriteLine(e.ToString()); return; } int recv = server.Receive(data); stringData = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine(stringData); while(true) { input = Console.ReadLine(); if (input == "exit") break; server.Send(Encoding.ASCII.GetBytes(input)); data = new byte[1024]; recv = server.Receive(data); stringData = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine(stringData); } Console.WriteLine("Disconnecting from server..."); server.Shutdown(SocketShutdown.Both); server.Close(); } }
Чтобы проверить совместную работу клиента и сервера, необходимо сначала в окне командной строки запустить TCP-сервер, после чего в другом консольном окне запустить клиента. После того, как они успешно обменялись начальными приветствиями, можно с помощью клавиатуры передавать между ними информацию.