Пересылка сообщений по сети - C#
Формулировка задачи:
Доброй всем ночи.
Я пишу на C# не так давно, и захотел написать приложение которое работало бы всети, но не знаю как начать.
Кто-нибудь может выложить\написать код 2 программ сервер и клиент, сервер бы при нажатии кнопки отсылал текстовое сообщение , а клиен бы его принимал. (Конечно если это не трудно)
Я думаю это был бы неплохой пример для начала изучения работы в сети.
Решение задачи: «Пересылка сообщений по сети»
textual
Листинг программы
//подключение необходимых пространств имен (ПИ) using System; //основные классы .Net using System.Text; //ссылка на это ПИ необходима для обращения к классу Encoding using System.Net; //средства для работы с сетью .Net using System.Net.Sockets; //средства для работы с сокетами .Net using System.Threading; //средства для параллельного исполнения программ namespace simpleChat { //изолируем наш класс от остальных static class simpleChat { //static class - работаем в процедурном стиле //------------------------------------------------------------------------------------------------------ //общие переменные //static string ip = "127.0.0.1"; //IP адрес static string ip = "192.168.0.151"; //IP адрес static int port = 7000; //порт static bool serverMode; //режим работы сервер/клиент static Socket mySock; //интерфейсное гнездо static Thread reading; //параллельный поток выполнения для приема данных от корреспондента //------------------------------------------------------------------------------------------------------ //начальная процедура static void Main(string [] args) { if (args.Length > 0) { IPAddress ipaddress; if (IPAddress.TryParse(args[0], out ipaddress)) ip = args[0]; } Console.WriteLine("Это простой чат\nНажмёте клавишу ENTER и станете Сервером. \nНажмёте иное - Клиентом"); serverMode = (Console.ReadLine() == ""); //создаем новый сокет на сетевом интерфейсе: //InterNetwork - используем семейство IP4 //Stream - работаем с удаленной точкой через установление постоянного соединения //Tcp - используем семейство протоколов Tcp mySock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //разница между сервером и клиентом имеется на этапе установления соединения if (serverMode) { //в режиме "Сервер" выполняем: //привязываем сокет на порт port //Any - IP адрес здесь не имеет значения //IPEndPoint(IPAddress.Any, port) - олицетворяет локальную точку (Точка это пара IP-адрес и порт) try { mySock.Bind(new IPEndPoint(IPAddress.Any, port)); } catch { Console.WriteLine("порт занят (или иное :). press any key "); Console.ReadKey(true); return; } //включаем прослушивание одного соединения mySock.Listen(1); Console.WriteLine("Режим сервер. Слушаю порт " + port + " ..."); //дожидаемся инициативы соединения от какого-либо удаленной (внешней) точки. mySock = mySock.Accept(); Console.WriteLine("Принято удаленное соединение " + mySock.RemoteEndPoint); Console.WriteLine("(для разрыва соединения введите +++)"); } else { //в режиме "Клиент" выполняем: Console.WriteLine("Режим клиент. Попытки подключения к " + ip + " " + port + " ..."); while (true) { //попытки: инициируем соединение с конкретной удаленной точкой try { mySock.Connect(new IPEndPoint(IPAddress.Parse(ip), port)); break; //нас услышали наконец } catch { } //нас могут и не слушать вовсе } Console.WriteLine("Режим клиент. Подключился к " + mySock.RemoteEndPoint); } //после установления соединения клиент и сервер ведут себя одинаково: reading = new Thread(Reading); //создаем поток, чтобы отсылка и чтение выполнялись параллельно reading.Start(); //запускаем поток чтения данных от корреспондента Sending(); //запускаем ппроцедуру отсылки данных корреспонденту mySock.Close(); //закрываем сокет } //------------------------------------------------------------------------------------------------------ //процедура передачи static void Sending() { String sendStr; while (true) { Console.Write(">>>"); sendStr = Console.ReadLine(); //получаем строку с клавиатуры if (sendStr == "+++") { Console.WriteLine("\nРазрываю соединение с " + mySock.RemoteEndPoint); break; } //строку, полученную с клавиатуры отсылаем корреспонденту, предварительно преобразовав в массив байтов try { mySock.Send(Encoding.Default.GetBytes(sendStr + "\r\n")); } catch { Console.WriteLine("\nУдаленный узел разорвал соединение"); break; } } reading.Abort(); //останавливаем поток чтения данных от корреспондента } //------------------------------------------------------------------------------------------------------ //процедура приема static void Reading() { int eolPos; //число принятых байт Byte[] receiveBuf = new Byte[256]; //буфер приема while (true) { //один виток цикла соответствует приему одной строки от корреспондента try { eolPos = mySock.Receive(receiveBuf); } //принимаем корреспонденцию в буфер приема catch { eolPos = 0; } //обработка момента окончания цикла if (eolPos == 0) { Console.WriteLine("\nУдаленный узел не отвечает (нажмите ENTER)"); break; } //печатаем принятую строку на ленту консоли Console.Write("\n<<<" + Encoding.Default.GetString(receiveBuf, 0, eolPos)); } } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д