Пересылка сообщений по сети - 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));
            }
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4 из 5
Похожие ответы