Net і c #, клієнт-серверний додаток на потоковому сокеті tcp
У наступному прикладі використовуємо TCP, щоб забезпечити впорядковані, надійні двосторонні потоки байтів. Побудуємо завершене додаток, що включає клієнт і сервер. Спочатку демонструємо, як сконструювати на потокових сокетах TCP сервер, а потім клієнтську програму для тестування нашого сервера.
Наступна програма створює сервер, який отримує запити на з'єднання від клієнтів. Сервер побудований синхронно, отже, виконання потоку блокується, поки сервер не дасть згоди на з'єднання з клієнтом. Ця програма демонструє простий сервер, який відповідає клієнту. Клієнт завершує з'єднання, відправляючи сервера повідомлення
сервер TCP
Створення структури сервера показано на наступній функціональної діаграмі:

Ось повний код програми SocketServer.cs:
Давайте розглянемо структуру даної програми.
Тут клас IPEndPoint представляє localhost на порту 11000. Далі новим екземпляром класу Socket створюємо потоковий сокет. Встановивши локальну кінцеву точку для очікування з'єднань, можна створити сокет:
У параметрі SocketType розрізняються сокети TCP і UDP. У ньому можна визначити в тому числі такі значення:
Підтримує доступ до базового транспортного протоколу.
Підтримує потокові сокети. Значення Stream вимагає вказати Tcp для типу протоколу.
Третій і останній параметр визначає тип протоколу, необхідний для сокета. У параметрі РrotocolType можна вказати наступні найбільш важливі значення - Tcp, Udp, Ip, Raw.
Наступним кроком має бути призначення сокета за допомогою методу Bind (). Коли сокет відкривається конструктором, йому не призначається ім'я, а тільки резервується дескриптор. Для призначення імені сокету сервера викликається метод Bind (). Щоб сокет клієнта міг ідентифікувати потоковий сокет TCP, серверна програма повинна дати ім'я своєму сокету:
Метод Bind () пов'язує сокет з локальною кінцевою точкою. Викликати метод Bind () треба до будь-яких спроб звернення до методів Listen () і Accept ().
Тепер, створивши сокет і зв'язавши з ним ім'я, можна слухати вхідні повідомлення, скориставшись методом Listen (). У стані прослуховування сокет чекатиме входять спроби з'єднання:
У параметрі визначається заділ (backlog). вказує максимальне число з'єднань, які очікують обробки в черзі. У наведеному коді значення параметра допускає накопичення в черзі до десяти з'єднань.
У стані прослуховування треба бути готовим дати згоду на з'єднання з клієнтом, для чого використовується метод Accept (). За допомогою цього методу виходить з'єднання клієнта і завершується встановлення зв'язку імен клієнта і сервера. Метод Accept () блокує потік викликає програми до надходження сполуки.
Метод Accept () витягує з черги чекають запитів перший запит на з'єднання і створює для його обробки новий сокет. Хоча новий сокет створений, початковий сокет продовжує слухати і може використовуватися з багатопотокової обробкою для прийому декількох запитів на з'єднання від клієнтів. Ніяке серверний додаток не повинно закривати слухає сокет. Він повинен продовжувати працювати поряд з сокетами, створеними методом Accept для обробки вхідних запитів клієнтів.
Як тільки клієнт і сервер встановили між собою з'єднання, можна відправляти і отримувати повідомлення, використовуючи методи Send () і Receive () класу Socket.
Метод Send () записує вихідні дані сокету, з яким встановлено з'єднання. Метод Receive () зчитує вхідні дані в потоковий сокет. При використанні системи, заснованої на TCP, перед виконанням методів Send () і Receive () між сокетами має бути встановлено з'єднання. Точний протокол між двома взаємодіючими сутностями повинен бути визначений завчасно, щоб клієнтське і серверне додатки не блокували один одного, не знаючи, хто повинен відправити свої дані першим.
Коли обмін даними між сервером і клієнтом завершується, потрібно закрити з'єднання використовуючи методи Shutdown () і Close ().
SocketShutdown - це перерахування, що містить три значення для зупинки: Both - зупиняє відправку та отримання даних сокетом, Receive - зупиняє отримання даних сокетом і Send - зупиняє відправку даних сокетом.
Сокет закривається при виклику методу Close (), який також встановлює у властивості Connected сокета значення false.
Клієнт на TCP
Функції, які використовуються для створення програми-клієнта, більш-менш нагадують серверний додаток. Як і для сервера, використовуються ті ж методи для визначення кінцевої точки, створення екземпляра сокета, відправки та отримання даних та закриття сокета:

Ось повний код для SocketClient.cs і його пояснення:
Єдиний новий метод - метод Connect (). використовується для з'єднання з віддаленим сервером. На малюнку нижче показані клієнт і сервер в дії:
