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