1 | |||||||||||||||||||||||||||||||||||||||||
Клиент-серверное приложение на потоковом сокете TCP21.06.2016, 14:01. Показов 4128. Ответов 1
В следующем примере используем TCP, чтобы обеспечить упорядоченные, надежные двусторонние потоки байтов. Построим завершенное приложение, включающее клиент и сервер. Сначала демонстрируем, как сконструировать на потоковых сокетах TCP сервер, а затем клиентское приложение для тестирования нашего сервера.
Следующая программа создает сервер, получающий запросы на соединение от клиентов. Сервер построен синхронно, следовательно, выполнение потока блокируется, пока сервер не даст согласия на соединение с клиентом. Это приложение демонстрирует простой сервер, отвечающий клиенту. Клиент завершает соединение, отправляя серверу сообщение <TheEnd>. Вот полный код программы SocketServer.cs:
Первый шаг заключается в установлении для сокета локальной конечной точки. Прежде чем открывать сокет для ожидания соединений, нужно подготовить для него адрес локальной конечной точки. Уникальный адрес для обслуживания TCP/IP определяется комбинацией IP-адреса хоста с номером порта обслуживания, которая создает конечную точку для обслуживания. Класс Dns предоставляет методы, возвращающие информацию о сетевых адресах, поддерживаемых устройством в локальной сети. Если у устройства локальной сети имеется более одного сетевого адреса, класс Dns возвращает информацию обо всех сетевых адресах, и приложение должно выбрать из массива подходящий адрес для обслуживания. Создадим IPEndPoint для сервера, комбинируя первый IP-адрес хост-компьютера, полученный от метода Dns.Resolve(), с номером порта:
В параметре SocketType различаются сокеты TCP и UDP. В нем можно определить в том числе следующие значения: Dgram Поддерживает дейтаграммы. Значение Dgram требует указать Udp для типа протокола и InterNetwork в параметре семейства адресов. Raw Поддерживает доступ к базовому транспортному протоколу. Stream Поддерживает потоковые сокеты. Значение Stream требует указать Tcp для типа протокола. Третий и последний параметр определяет тип протокола, требуемый для сокета. В параметре РrotocolType можно указать следующие наиболее важные значения - Tcp, Udp, Ip, Raw. Следующим шагом должно быть назначение сокета с помощью метода Bind(). Когда сокет открывается конструктором, ему не назначается имя, а только резервируется дескриптор. Для назначения имени сокету сервера вызывается метод Bind(). Чтобы сокет клиента мог идентифицировать потоковый сокет TCP, серверная программа должна дать имя своему сокету:
Теперь, создав сокет и связав с ним имя, можно слушать входящие сообщения, воспользовавшись методом Listen(). В состоянии прослушивания сокет будет ожидать входящие попытки соединения:
В состоянии прослушивания надо быть готовым дать согласие на соединение с клиентом, для чего используется метод Accept(). С помощью этого метода получается соединение клиента и завершается установление связи имен клиента и сервера. Метод Accept() блокирует поток вызывающей программы до поступления соединения. Метод Accept() извлекает из очереди ожидающих запросов первый запрос на соединение и создает для его обработки новый сокет. Хотя новый сокет создан, первоначальный сокет продолжает слушать и может использоваться с многопоточной обработкой для приема нескольких запросов на соединение от клиентов. Никакое серверное приложение не должно закрывать слушающий сокет. Он должен продолжать работать наряду с сокетами, созданными методом Accept для обработки входящих запросов клиентов.
Метод Send() записывает исходящие данные сокету, с которым установлено соединение. Метод Receive() считывает входящие данные в потоковый сокет. При использовании системы, основанной на TCP, перед выполнением методов Send() и Receive () между сокетами должно быть установлено соединение. Точный протокол между двумя взаимодействующими сущностями должен быть определен заблаговременно, чтобы клиентское и серверное приложения не блокировали друг друга, не зная, кто должен отправить свои данные первым. Когда обмен данными между сервером и клиентом завершается, нужно закрыть соединение используя методы Shutdown() и Close():
Сокет закрывается при вызове метода Close(), который также устанавливает в свойстве Connected сокета значение false. Клиент на TCP Вот полный код для SocketClient.cs и его объяснение:
1
|
21.06.2016, 14:01 | |
Ответы с готовыми решениями:
1
Клиент-серверное приложение: как определить, что сервер/клиент не отвечает в течении определенного времени Клиент-серверное приложение Клиент-серверное приложение клиент-серверное приложение |
12078 / 8387 / 1281
Регистрация: 21.01.2016
Сообщений: 31,595
|
|
22.06.2016, 08:48 | 2 |
namemkazaza, такие вещи в личном блоге делать нужно...
0
|
22.06.2016, 08:48 | |
22.06.2016, 08:48 | |
Помогаю со студенческими работами здесь
2
Закрывается клиент-серверное приложение Асинхронное клиент серверное приложение Как написать клиент-серверное приложение Клиент-серверное приложение по Интернету с динамическим IP Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |