Есть примеры (откомпилированные).
Версия от 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