Вверх ↑
Этот топик читают: Гость
Ответов: 4612
Рейтинг: 746
#1: 2017-03-13 14:08:46 ЛС | профиль | цитата
Компоненты PipeClient и PipeServer

Обмен данными между приложениями через именованные каналы.

Версия от 27.03.2017


СКАЧАТЬ



Компоненты построены по тому же принципу, что и мои TCP клиент и сервер. По своему назначению аналогичны DDEClient/DDEServer или MailSlot_Client/MailSlot_Server.

Пока что не реализована асинхронная отправка данных.

Перечень точек и свойств

PipeClient

- Свойства:

PipeName=Имя pipe (канала) для открытия
Mode=Режим открытия канала. Read - клиент может только читать данные, сервер - писать. Write - наоборот. ReadWrite - и клиент и сервер могут читать и писать данные. Чтение данных не запускается в режиме Write
AsyncEvents=Асинхронная выдача событий (из пераллельных потоков, когда применимо). Если наблюдаются проблемы в обработке - используйте компонент Synchronize на выходе либо выключите.
SendTimeout=Таймаут отправки данных в миллисекундах. Если сервер не примет данные в течении этого времени, произойдет событие onErrorSend с кодом 258. Если 0 - не ограничивать. Метод doSend не возвратит управление, пока клиент не примет данные или не истечет таймаут.
ConnectTimeout=Таймаут подключения в миллисекундах. Если канал существует, но в течении этого времени сервер не успеет принять входящее подключение, произойдет событие onErrorConnect с кодом 231.
ReadBufSize=Размер буфера чтения. Данные событием onReceive будут выдаваться порциями не большими, чем это значение, и не больше, чем WriteBufSize сервера.
WriteBufSize=Размер буфера записи. Данные отправляются порциями указанного размера. Сервер будет принимать данные фрагментами не большими, чем это значение

- Методы:
doSend=Отправить данные Data на сервер. Повторная отправка данных невозможна до появления события onSend/onSendError
doConnect=Подключиться к каналу PipeName
doDisconnect=Отключиться от сервера
*doAbortSend=Прервать отправку данных (вызвать этот метод можно только из параллельного потока)

- События:
onReceive=Происходит при получении данных от сервера
onSend=Происходит по завершению отправки данных методом doSend
onConnect=Происходит при успешном подключении к каналу методом doConnect
onDisconnect=Происходит при разрыве соединения сервером или ошибках, при которых дальнейшая работа с текущим подключением невозможна
*onErrorConnect=Происходит при ошибке подключения методом doConnect. Выдаёт в поток код ошибки
*onErrorSend=Происходит при ошибке отправки данных. Выдаёт в поток код ошибки


PipeServer

- Свойства:

Те же, что и у клиента, кроме ConnectTimeout

- Методы:
doSend=Отправить данные Data клиенту ClientID
doStartServer=Создать канал (pipe) с именем PipeName и запустить ожидание подключений
doStopServer=Остановить сервер и отключить всех клиентов
doClose=Разорвать указанное соединение
*doAbortSend=Прерывает отправку данных указанному клиенту
*doAbortSendAll=Прерывает отправку данных всем клиентам
*doCloseAll=Разрывает соединение со всеми клиентами без остановки сервера
*doEnumClients=Перебирает все текущие соединения и выдает их идентификаторы на onEnumClients
*doSendAll=Отослать данные всем клиентам
*doStopListening=Остановить приём новых подключений без отключения текущих клиентов

- События:
onReceive=Происходит при получении данных от клиента и выдаёт в поток полученные данные
onClientConnect=Событие происходит при подключении нового клиента. После этого канал с тем же именем будет пересоздан и продолжится ожидание нового подключения. В поток выдаёт идентификатор нового клиента
onClientDisconnect=Событие происходит при отключении клиента. Возможно только в режимах Read/ReadWrite в процессе приема данных. В поток выдаёт идентификатор клиента
*onSend=Событие происходит после завершения передачи данных методами отправки данных. Выдает в поток идентификатор клиента
*onStartServer=Событие происходит после успешного создания первой pipe после вызова doStartServer
*onEnumClients=Происходит в процессе перебора клиентов по doEnumClients и выдает в поток идентификатор
*onErrorStart=Событие происходит при ошибке создания pipe и выдаёт в поток код ошибки. Теоретически, может произойти после успешного приёма нескольких подключений. Приём новых подключений будет остановлен.
*onErrorSend=Событие происходит при ошибках отправки данных и выдаёт в поток код ошибки


Редактировалось 12 раз(а), последний 2017-05-26 15:56:21
карма: 26

7
Голосовали:flint2, Nickname, halt, Konst, miver, Gunnman, Gunta
vip
#1.1контекстная реклама от партнеров
Ответов: 165
Рейтинг: 6
#2: 2017-03-14 09:29:05 ЛС | профиль | цитата
Теперь для полного счастья не хватает только Альтернативного TCP_ServerEx
карма: 4

0
Разработчик
Ответов: 4697
Рейтинг: 426
#3: 2017-03-14 13:51:34 ЛС | профиль | цитата
Nickname, так они же уже есть. Или вы о чем?
карма: 10
0
Ответов: 4612
Рейтинг: 746
#4: 2017-03-14 14:00:47 ЛС | профиль | цитата
Нет, требуется именно Ex - динамический мультик, в котором на каждое соединение создаётся отдельная схема. В текущих реализациях есть сложность сохранения состояния соединения (например, в процессе реализации протокола на основе принимаемых данных). При этом автоматически предполагается, что работа каждой схемы ведется в параллельном потоке, без необходимости синхронизации между соединениями (при необходимости можно выходы из мультика в основную схему сделать синхронными).
Я тут обдумываю реализовать это мультиком, который будет подключаться к PipeServer/TCPServer как к менеджеру.
карма: 26

1
Голосовали:Nickname
Ответов: 2059
Рейтинг: 131
#5: 2017-03-14 17:17:48 ЛС | профиль | цитата
динамический мультик, в котором на каждое соединение создаётся отдельная схема.

Netspirit, правильно я понимаю, что это в границах запущенного процесса?
Тогда динамически создаваемые юниты
При этом автоматически предполагается, что работа каждой схемы ведется в параллельном потоке, без необходимости синхронизации между соединениями

могут "общаться" между собой?
карма: 6

0
Ответов: 4612
Рейтинг: 746
#6: 2017-03-14 17:30:49 ЛС | профиль | цитата
flint2 писал(а):
могут "общаться" между собой?
Это отдельная задача: нужно будет сделать компонент, который сможет читать/сохранять/искать некоторые данные в произвольном соединении. На примере чата с центральным сервером: при подключении и аутентификации клиента, его логин сохраняется с соединением. При отправке сообщения данному клиенту, другое соединение ищет активное соединение с данным логином, и уже ему отправляет.
карма: 26

0
Ответов: 2059
Рейтинг: 131
#7: 2017-03-14 17:43:48 ЛС | профиль | цитата
Это отдельная задача

Если в струе, то не кисло бы было.
----------------------------------
Пардон муа, постарайся, чтобы функции были доступны из других квадратиков.
Так красиво будет.

Редактировалось 6 раз(а), последний 2017-03-14 21:46:40
карма: 6

0
Ответов: 655
Рейтинг: 18
#8: 2017-03-17 23:23:22 ЛС | профиль | цитата
Уррра пайпы)))) тестируем!!
карма: 0

0
Ответов: 824
Рейтинг: 138
#9: 2017-03-18 08:18:42 ЛС | профиль | цитата
Win 7 x64
При подключенном клиенте к серверу, остановка сервера вызывает его "падение".

Редактировалось 2 раз(а), последний 2017-03-18 08:20:12
карма: 1

0
Ответов: 4612
Рейтинг: 746
#10: 2017-03-20 11:49:08 ЛС | профиль | цитата
Если я правильно понял последовательность действий:
- запустить тестовый сервер
- нажать "Запустить сервер"
- запустить тестовый клиент
- нажать "Подключиться"

Затем если нажать "Остановить сервер", либо просто закрыть программу сервера, должна выскочить ошибка? Только что это проделал - Windows 7 x64, Core i5 4590, ошибки не появилось.

Попробуй проверь на откомпилированных примерах из архива (сам не компилируй).

Редактировалось 1 раз(а), последний 2017-03-20 11:50:21
карма: 26

0
Ответов: 824
Рейтинг: 138
#11: 2017-03-20 20:53:56 ЛС | профиль | цитата
Да, ошибка не происходит на примерах из архива....
А чего так...?

Редактировалось 1 раз(а), последний 2017-03-20 20:54:23
карма: 1

0
Ответов: 4612
Рейтинг: 746
#12: 2017-03-21 12:09:13 ЛС | профиль | цитата
Я последовательность действий правильно понял? А ты у себя что делал - просто перекомпилировал примеры? Или что-то менял? В процессе теста делал отправку файлов? Что-то ещё?
карма: 26

0
Ответов: 824
Рейтинг: 138
#13: 2017-03-23 20:17:25 ЛС | профиль | цитата
Netspirit, Нет времени нормально протестировать, прошу прощения.
В основном, на форум захожу с телефона. Компьютер жена "оккупировала"...
карма: 1

0
Ответов: 4612
Рейтинг: 746
#14: 2017-03-28 10:43:23 ЛС | профиль | цитата
Обновлены компоненты

Функционал не изменился. Некоторые переработки в коде, исправление потенциальных, и, возможно, действительных ошибок.
карма: 26

1
Голосовали:Konst
Ответов: 655
Рейтинг: 18
#15: 2017-05-20 19:13:00 ЛС | профиль | цитата
Netspirit, В вашем TCP_Server если не ошибаюсь до 50 подключений обрабатываются в 1 потоке. Тут тот же принцип?
карма: 0

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)