Вверх ↑
Ответов: 4612
Рейтинг: 746
#1: 2013-12-01 17:07:08 ЛС | профиль | цитата
Клиент и сервер TCP
Есть примеры (откомпилированные).



Версия от 27.03.2017
После обновления можете удалить файл TCPClientServer.pas (был переименован на NSTCP.pas)

СКАЧАТЬ


Зачем всё это

На форуме периодически появляются вопросы по использованию компонентов "TCP-сервер" и "TCP-клиент".
В процессе обсуждения не раз возникало ощущение, что в этих компонентах не хватает многих важных и не очень вещей.
В какой-то момент в процессе поиска информации по работе с сетью у меня сложилась полная картина того, чего мне не хватает и какими возможностями должны обладать клиент и сервер в HiAsm. И главное: каким образом это может быть реализовано.
Так были сделаны эти компоненты.

Описание особенностей

Компоненты от стандартных отличаются следующим.

Для автора схемы:

- TCPClient

1) Подключение, отправка и прием данных в синхронном/асинхронном режиме
2) Добавлено событие, сообщающее о завершении отправки
3) Отдельные события об ошибках подключения и отправки с выдачей кодов ошибок
4) Прерывание отправки данных
5) Отключение/включение приема данных без ущерба для отправки
6) События и методы имеют несколько другие названия.
7) Возможность получать асинхронные события

- TCPServer

1) Ведется учет клиентов не по IP, а по ID, что допускает одновременные независимые соединения с одного IP.
2) Существуют почти все методы TCP-клиента, применимые как к выбранному соединению, так и ко всем.
3) Возможность останавливать прием новых подключений, не прекращая обслуживать текущие.

Как клиент так и сервер могут работать в неоконных приложениях. В папке примеров есть консольные демо.

Исходный код

Компоненты реализованы с использованием параллельных потоков и блокирующих Winsock-функций вместо асинхронных через оконные сообщения.

Поскольку класс потока в KOL достаточно глючный, был сделан отдельный модуль со своим классом потока, который работает достаточно стабильно на всех компиляторах.
За счет этого также стало возможным реализовать синхронизацию потоков в неоконных проектах (у них нет переменной Applet и главной очереди сообщений, которые необходимы для синхронизации KOL-овскому потоку).
Этот поток можно использовать и в других компонентах.

Сервер создает один дополнительный поток для приема входящих подключений. Создаётся по 1 одному дополнительному потоку на каждые 64 соединения для приема данных. Для асинхронной отправки используется ещё до 5-ти потоков.

В коде достаточно широкий набор классов для использования в сторонних компонентах.

Перечень точек

TCPClient

doSend - Отправить данные Data на сервер. Повторная отправка данных невозможна до появления события onSend/onSendError
doSendAsync - Отправить данные на сервер в асинхронном режиме. Повторная отправка данных невозможна до появления события onSend/onSendError
doConnect - Подключиться к порту Port сервера с адресом IP
doDisconnect - Отключиться от сервера
doAbortSend - Прервать отправку данных (для данных, посылаемых методом doSend, вызвать этот метод можно только из параллельного потока)
doStopReceiving - Остановить прием данных (передача продолжает работать). После остановки приема данных событие onDisconnect будет возникать только как следствие некоторых ошибок при отправке данных
doStartReceiving - Возобновить прием данных после метода doStopReceiving

onReceive - Происходит при получении данных от сервера. Данные приходят порциями по выбору системы
onSend - Происходит по завершению отправки данных методами doSend и doSendAsync. Нет гарантии, что данные были полностью получены сервером на момент исполнения этого события
onConnect - Происходит при успешном подключении к серверу методом doConnect
onDisconnect - Происходит при разрыве соединения сервером или ошибках, при которых дальнейшая работа с текущим подключением невозможна
onErrorConnect - Происходит при ошибке подключения методом doConnect. Выдаёт в поток код ошибки
onErrorSend - Происходит при ошибке отправки данных. Выдаёт в поток код ошибки
onProgress - Происходит в процессе отправки и выдаёт в поток количество отправленных байтов

Data - Данные для отправки на сервер
IP - IP-адрес сервера для подключения
Port - Номер порта для подключения


TCPServer

doSend - Отослать данные указаному клиенту
doStartServer - Запускает сервер на локальном порту и ожидает подключений
doStopServer - Разрывает соединение со всеми клиентами и останавливает сервер
doAbortSend - Прерывает отправку данных указанному клиенту
doAbortSendAll - Прерывает отправку данных всем клиентам
doClose - Разорвать указанное соединение
doCloseAll - Разрывает соединение со всеми клиентами без остановки сервера
doEnumClients - Перебирает все текущие соединения и выдает их идентификаторы на onEnumClients
doSendAll - Отослать данные всем клиентам
doSendAsync - Отослать данные указаному клиенту асинхронно
doSendAllAsync - Отослать данные всем клиентам асинхронно
doStopListen - Остановить прием новых подключений. Текущие подключения продолжают обслуживаться. Для возобновления нужно вызвать doStartServer

onReceive - Происходит при получении данных от клиента
onClientConnect - Событие происходит при соединении нового клиента к серверу и выдает в поток идентификатор клиента
onClientDisconnect - Событие происходит при отсоединении клиента от сервера и выдает в поток его идентификатор
onSend - Событие происходит после завершения передачи данных методами отправки данных. Выдает в поток идентификатор клиента
onStartServer - Событие происходит при успешном запуске сервера методом doStartServer
onEnumClients - Происходит в процессе перебора клиентов по doEnumClients и выдает в поток идентификатор
onErrorStart - Событие происходит при ошибке запуска сервера методом doStartServer. Выдаёт в поток код ошибки
onErrorSend - Происходит при ошибке отправки данных. Выдаёт в поток код ошибки
onProgress - Происходит в процессе отправки данных и выдаёт в поток количество отправленных байтов для клиента CurClientID.

Data - Данные для отправки клиентам
ClientID - Идентификатор клиентского соединения для методов работы с соединением
Port - Порт сервера

Count - Возвращает количество активных соединений (клиентов)
CurClientID - Содержит текущий идентификатор соединения на момент соответствующих событий
CurIPAddress - Содержит текущий IP-адрес на момент событий onClientConnect, onEnumClients

карма: 26

17
Голосовали:Assasin, Andrey, Konst, ser_davkin, LainX, -= DriveR =-, Shonyi, filyaxxxcom, flud, login, Nickname, Nighthead, hin4, strannik_nebes, Gunnman, lisnic, TheRenat
Редактировалось 5 раз(а), последний 2017-10-03 16:49:18