Last active
April 14, 2025 12:41
-
-
Save sunmeat/fdf1bcb10ffc34fd1a312075ad587e02 to your computer and use it in GitHub Desktop.
SERVER SIDE network programming example 1
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System.Net; // основное пространство имён для работы с сетевыми адресами и протоколами | |
using System.Net.Sockets; // пространство имён для работы с сокетами | |
using System.Text; // пространство имён для работы с кодировками | |
class Server // класс реализует серверную логику | |
{ | |
private const int DEFAULT_BUFLEN = 512; // задаёт размер буфера для получения данных | |
// если нужно работать с большим количеством данных, рекомендуется использовать буферы от 4 КБ до 64 КБ (размер, с которым обычно работают сетевые приложения) | |
// если данные небольшие и ожидается, что они будут приходить в небольших объёмах, можно использовать буфер 512 байт или даже меньше | |
private const string DEFAULT_PORT = "27015"; // указывает порт, на котором сервер будет прослушивать подключения | |
private const int PAUSE = 1000; // задаёт паузу в миллисекундах для красоты и удобства вывода сообщений (можно смело убрать) | |
static void Main() | |
{ | |
Console.OutputEncoding = Encoding.UTF8; // кириллица | |
Console.Title = "SERVER SIDE"; | |
Console.WriteLine("Процесс сервера запущен!"); | |
Thread.Sleep(PAUSE); | |
try | |
{ | |
var ipAddress = IPAddress.Any; // получает любой доступный IP-адрес для прослушивания (означает, что сервер будет слушать на всех интерфейсах, например, Wi-Fi, Ethernet | |
var localEndPoint = new IPEndPoint(ipAddress, int.Parse(DEFAULT_PORT)); // создаёт конечную точку (адрес и порт), к которой сервер будет привязан | |
var listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // создаёт сокет для использования TCP-соединения (потоковый сокет) | |
listener.Bind(localEndPoint); // привязывает сокет к указанному адресу и порту | |
Console.WriteLine("Получение адреса и порта сервера прошло успешно!"); | |
Thread.Sleep(PAUSE); | |
listener.Listen(10); // начинает прослушивание входящих соединений, устанавливая максимальное количество ожидающих соединений (10), то есть сервер может иметь до 10 клиентов (соединений) в очереди на подключение | |
Console.WriteLine("Начинается прослушивание информации от клиента.\nПожалуйста, запустите клиентскую программу!"); | |
var clientSocket = listener.Accept(); // ожидает подключение клиента и принимает его, возвращая сокет для общения с клиентом. есть AcceptAsync(), чтоб не блокировать поток | |
Console.WriteLine("Подключение с клиентской программой установлено успешно!"); | |
listener.Close(); // закрывает сокет слушателя, так как соединение с клиентом уже установлено | |
// соединение с клиентом теперь управляется отдельным сокетом, полученным от метода Accept(), и слушающий сокет больше не нужен | |
while (true) | |
{ | |
var buffer = new byte[DEFAULT_BUFLEN]; // создаёт буфер для хранения полученных данных | |
int bytesReceived = clientSocket.Receive(buffer); // получает данные от клиента и сохраняет их в буфер | |
if (bytesReceived > 0) // если данные были получены | |
{ | |
string message = Encoding.UTF8.GetString(buffer, 0, bytesReceived); | |
Console.WriteLine($"Процесс клиента отправил сообщение: {message}"); // выводит полученное сообщение | |
Thread.Sleep(PAUSE); // делает паузу | |
string response = "Hello from server!"; // формирует ответ для клиента | |
byte[] responseBytes = Encoding.UTF8.GetBytes(response); // преобразует ответ в массив байтов | |
clientSocket.Send(responseBytes); // отправляет ответ клиенту | |
Console.WriteLine($"Процесс сервера отправляет ответ: {response}"); | |
Thread.Sleep(PAUSE); | |
} | |
else if (bytesReceived == 0) // если клиент закрыл соединение (получен 0 байтов) | |
{ | |
Console.WriteLine("Соединение закрывается..."); // информирует о том, что соединение будет закрыто | |
break; | |
} | |
else | |
{ | |
Console.WriteLine("Ошибка при получении данных."); | |
break; | |
} | |
} | |
clientSocket.Shutdown(SocketShutdown.Send); // закрывает сокет для отправки данных (клиент завершил отправку) | |
clientSocket.Close(); // закрывает сокет для общения с клиентом | |
Console.WriteLine("Процесс сервера завершает свою работу!"); | |
} | |
catch (Exception ex) | |
{ | |
Console.WriteLine($"Произошла ошибка: {ex.Message}"); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
CLIENT SIDE: https://gist.github.com/sunmeat/a104085a559f7b3f4cd5ff9f7dadb283