Telnet localhost 2200

Окно Telnet покажет нам сообщение переданное сервером.

 

Версия 2 – Использование сокетов для соединения

 

Теперь давайте рассмотрим на примере сокетов. Оставим эти два класса, вместо них будем использовать класс System.Net.Sockets.Socket. На самом деле разница заключается в настройке соединения:

1 2 Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

Первый параметр задает схему адресации, мы выбрали InterNetwork.

Так же есть и схемы: AppleTalk, ATM, Banyan, Chaos, DataKit, DecNet, Iso, Osi и многие другие. ProtocolType указывает тот протокол, который используется.

 

1 2 3 4 5 6 7 8 9 10 11 12 // Привязываемся к нашему IP адресу IPAddress localAddress = IPAddress.Parse("127.0.0.1");   // Инициализируем новый экземпляр IPEndPoint(узел) с IP адресом и портом IPEndPoint ipEndpoint = new IPEndPoint(localAddress, 2200);   // Делаем привязку к IPEndPoint listenSocket.Bind(ipEndpoint);   //Начинаем слушать, указываем что только 1 соединение может быть в одно время listenSocket.Listen(1);

Так же как и в случае с TCPListener нам необходимо прослушивать 127.0.0.1:2200. Полный код программы:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 using System; using System.Text; using System.Net; using System.Net.Sockets;   namespace SimpleServerUsingSockets { class Program { public static void Main() { System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();   try { IPAddress localAddress = IPAddress.Parse("127.0.0.1");   Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);   IPEndPoint ipEndpoint = new IPEndPoint(localAddress, 2200);   listenSocket.Bind(ipEndpoint);   listenSocket.Listen(1);   // Начинаем ждать соединение – бесконечный цикл while (true) { Console.WriteLine("Сервер ожидает {0}", ipEndpoint);   // Программа приостановлена. Ожидаем входящего соединения // Это синхронное TCP приложение Socket handler = listenSocket.Accept();   //Входящее соединение необходимо обработать Console.WriteLine("Принято соединение от {0}", handler.RemoteEndPoint);   Console.WriteLine("Отправляем сообщениею.."); handler.Send(encoding.GetBytes("Я занят"));   // Соединение необходимо закрыть Console.WriteLine("Закрытие соединение"); handler.Close(); }   } catch (Exception e) { Console.WriteLine("Произошла ошибка: {0}", e.ToString()); } } } }

 

Версия 3 –Ассинхронный

 

В двух предыдущих примерах использовался синхронный ввод-вывод. Нам необходимо ждать пока удаленная система подсоединится, тогда программа продолжит работу. Конечно, в реальной жизни хотелось, чтобы наш сервер был лучше. Для этого нам необходимо использовать асинхронный ввод-вывод. Вся сложная работа сделана в методах BeginAccept и EndAccept. При вызове метода BeginAccept необходимо указать функцию обратной связи, т.е мы должны сослаться на метод, который должен вызываться при завершении соответствующей асинхронной операции. Этот метод обратного вызова реализует делегат AsyncCallback, выполняется в отдельном потоке и вызывается системой после возврата значения методом BeginAccept. В теле функции обратной связи необходимо вызвать EndAccept для связи с удаленным узлом.

 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 using System; using System.Text; using System.Net; using System.Net.Sockets; using System.Threading;   namespace SimpleServer { class Program { public static void ReceiveCallback(IAsyncResult AsyncCall) { System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); Byte[] message = encoding.GetBytes("Я занят");   Socket listener = (Socket)AsyncCall.AsyncState; Socket client = listener.EndAccept(AsyncCall);   Console.WriteLine("Принято соединение от: {0}", client.RemoteEndPoint); client.Send(message);   Console.WriteLine("Закрытие соединения"); client.Close();   // После того как завершили соединение, говорим ОС что мы готовы принять новое listener.BeginAccept(new AsyncCallback(ReceiveCallback), listener); }   public static void Main() { try {   IPAddress localAddress = IPAddress.Parse("127.0.0.1");   Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);   IPEndPoint ipEndpoint = new IPEndPoint(localAddress, 2200);   listenSocket.Bind(ipEndpoint);   listenSocket.Listen(1); listenSocket.BeginAccept(new AsyncCallback(ReceiveCallback), listenSocket); Console.WriteLine("Ожидание соединения… {0}", listenSocket.LocalEndPoint);   while (true) {   Console.WriteLine("Занят...."); Thread.Sleep(2000); }   } catch (Exception e) { Console.WriteLine("Произошла ошибка: {0}", e.ToString()); } } } }

ЗАДАНИЕ 3.

Простейший пример реализации клиент-серверного приложения, принципы которого применяются в сетевых приложениях и играх.

Серверная часть

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets; using System.IO;   namespace Server { class Program { static void Main(string[] args) { TcpListener listner = new TcpListener(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 12000)); listner.Start(); while (true) { TcpClient client = listner.AcceptTcpClient();   StreamReader sr = new StreamReader(client.GetStream()); Console.WriteLine("Client: " + sr.ReadLine());   StreamWriter sw = new StreamWriter(client.GetStream()); sw.AutoFlush = true; Console.WriteLine("Server: Привет"); sw.WriteLine("Привет");   Console.WriteLine("Client: " + sr.ReadLine()); Console.WriteLine("Server: Пока"); sw.WriteLine("Пока");   client.Close(); } } } }

Клиентская часть

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Sockets; using System.Net; using System.IO;   namespace Client { class Program { static void Main(string[] args) { TcpClient client = new TcpClient(); client.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 12000));   StreamWriter sw = new StreamWriter(client.GetStream()); sw.AutoFlush = true; Console.WriteLine("Client: Привет"); sw.WriteLine("Привет");   StreamReader sr = new StreamReader(client.GetStream()); Console.WriteLine("Server: " + sr.ReadLine());   Console.WriteLine("Client: Пока"); sw.WriteLine("Пока"); Console.WriteLine("Server: " + sr.ReadLine()); client.Close();   Console.ReadKey(); } } }

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: