Вверх ↑
Этот топик читают: Гость
Ответов: 2125
Рейтинг: 159
#1: 2006-10-06 11:50:14 ЛС | профиль | цитата
Существующий на данный момент TCP_Server не позволяет делать нормальный сервер, так как его doSend отправляет одинаковые данные всем соединениям (такое подходит только для чата). В отличие от него новый TCP_ServerEx - это контейнер, в котором происходит работа с каждым соединением в отдельности, для чего в контейнере есть TCP_Client, который представляет собой соединение сервера. Старт сервера - точка ##add, останов - ##clear. Каждое новое соединение порождает новый мультик, и событие ##add внутри контейнера.

Используется модифицированный hiTCP_Client.pas, функционально ничем не отличающийся, добавлены только новые функции, используемые в TCP_ServerEx.

P.S. Ниже есть обновление http://www.hiasm.com/xf/topic.php?p=36736#P36736
карма: 1

0
файлы: 1TCP_ServerEx.rar [3.2KB] [968]
Администрация
Ответов: 15295
Рейтинг: 1519
#2: 2006-10-06 14:46:21 ЛС | профиль | цитата
На мой взгляд стоит сделать точки ##Open и ##Close для старта и остановки сервера, ##Select для выбора в качестве текущей схемы один из коннектов, ##Delete - принудительный дисконнект клиента, ##Clear - принудительный дисконнект всех клиентов(сервер остается запущенным), ##Add - эта точка просто перекрывается и остается пустой.
Так же имеет смысл сделать отдельный TCP_Client без точки doOpen и автоудаление экземпляра схемы при doClose этого клиента(если это еще не делается конечно).
карма: 27
1
Голосовали:Rood-J
Ответов: 2125
Рейтинг: 159
#3: 2006-10-06 16:32:42 ЛС | профиль | цитата
На мой взгляд стоит сделать точки ##Open и ##Close для старта и остановки сервера
Сначала я так и хотел сделать, но потом понадобился индекс точки #Add, чтобы при создании нового соединения (схемы) иметь возможность вызвать это событие. Сейчас он сохраняется при старте сервера посредством вызова #Add. В принципе, можно отказаться от точки #Add и вызывать событие onConnect компонента TCP_Client, так даже логичнее будет.
##Select и ##Delete в принципе не проверял, но должны работать.

Если ты смотрел код TCP_ServerEx, то наверное заметил некоторое трюкачество при получении ссылки на TCP_Client, а также неудобство с CreateInstance и HDelete. Проблемы следующие:
1. Невозможно легально получить указатель на главный элемент порождённой схемы.
2. Невозможно произвести дополнительные действия в момент CreateInstance (надо бы её сделать overload и объявить protected)
3. Невозможно удалить схему, не вызывая при этом точку HDelete или Delete (чтобы сделать автоудаление экземпляра схемы, надо бы в THIMultiElementEx сделать DeleteInstance, тоже protected).

1 и 2 можно было бы решить, возложив необходимую инициализацию на TCP_Client, точнее на другой класс, порождённый от TCP_Client (например TCP_Connection), принудительно преобразовав Parent-a к THITCP_ServerEx. Только вот опять-же - где его взять.

TCP_Client без точки doOpen
... и без свойств IP и Port. Да, была мысль сделать TCP_Connection (наследник TCP_Client), но я побоялся добавлять его в скрытую группу, неизвестно как отреагирует инсталлятор. Но в принципе, так логичнее.
карма: 1

0
Администрация
Ответов: 15295
Рейтинг: 1519
#4: 2006-10-06 17:26:49 ЛС | профиль | цитата
вызывать событие onConnect компонента TCP_Client, так даже логичнее будет.

Именно. onConnect должно вызываться всегда, при присоединение нового клиента, а onDisconnect при его отключение(принудительном и обычном).

1,2,3 - со всем согласен. До этого не возникало необходимости в таких методах поскольку не было компонент построенных по принципу одного родителя и множества потомков(PageControl был бы таким, если бы удалось его реализовать).

Да, была мысль сделать TCP_Connection (наследник TCP_Client), но я побоялся добавлять его в скрытую группу, неизвестно как отреагирует инсталлятор

Неплохо бы было его внески в среду не только в качестве компонента, но и примера несколько иного использования MultiElementEx
карма: 27
0
Ответов: 2125
Рейтинг: 159
#5: 2006-10-06 22:57:45 ЛС | профиль | цитата
сделать точки ##Open и ##Close
А ничё, если мы эти точки тоже в EditMultiEx.ini добавим?
карма: 1

0
Администрация
Ответов: 15295
Рейтинг: 1519
#6: 2006-10-07 15:53:52 ЛС | профиль | цитата
По идее нет.
карма: 27
0
Ответов: 2125
Рейтинг: 159
#7: 2006-10-07 21:00:29 ЛС | профиль | цитата
А тада нада и в hiMultiElementEx.pas сделать такие функции, чтобы потом не говорили: "Я вот тут точку отметил, а у меня не компилируется, баг в компоненте ..."
карма: 1

0
Администрация
Ответов: 15295
Рейтинг: 1519
#8: 2006-10-07 21:52:30 ЛС | профиль | цитата
Их надо в TCp_ServerEx делать.
карма: 27
0
Ответов: 2125
Рейтинг: 159
#9: 2006-10-08 17:30:51 ЛС | профиль | цитата
Их надо в TCp_ServerEx делать.
Это-то само собой, но раз уж они будут стандартными у EditMultiEx надо сделать их и у MultiElementEx, хотя-бы пустыми, чтобы не было ошибки компиляции, если тупой пользователь их будет использовать. Защита на дурака.

[size=-2]------ Добавлено в 17:30
сделать точки ##Open и ##Close
Сделал.
карма: 1

0
Ответов: 2125
Рейтинг: 159
#10: 2006-10-09 14:31:24 ЛС | профиль | цитата
Подправил кое-что, баги были.
карма: 1

0
файлы: 1TCP_ServerEx1.rar [4.8KB] [799]
Администрация
Ответов: 15295
Рейтинг: 1519
#11: 2006-10-10 02:02:27 ЛС | профиль | цитата
но раз уж они будут стандартными

Почему они будут стандартными? В справке так и написать, что данные точки есть расширение для конкретного элемента и не применимо ко всем остальным контейнерам
карма: 27
0
Ответов: 2125
Рейтинг: 159
#12: 2006-10-10 10:55:26 ЛС | профиль | цитата
Может сделать фичу для всех Class=MultiElementEx: скрытые точки с типом 5-8 добавить к EditMulti как точки соответствующих типов 1-4? Заодно и комментарии будут от конкретного наследника MultiElementEx.
карма: 1

0
Администрация
Ответов: 15295
Рейтинг: 1519
#13: 2006-10-10 12:57:15 ЛС | профиль | цитата
Для чего это нужно?
карма: 27
0
Ответов: 2125
Рейтинг: 159
#14: 2006-10-10 23:03:10 ЛС | профиль | цитата
Дык чтобы не добавлять в EditMulti.ini точки, которые
есть расширение для конкретного элемента

карма: 1

0
Ответов: 13
Рейтинг: 0
#15: 2006-11-07 12:34:30 ЛС | профиль | цитата
Что-то непонятно как пользоватся этим компонентом ??!!
Например тут:

Add(TCP_Server,2592065,109,182)
{
Port=80
Point(doCloseAll)
link(onRead,6488238:doSplit,[(146,188)(118,188)])
}
Add(StrPart,6488238,165,182)
{
Char=" "
Point(Right)
link(onPart,3881173:doCase,[(230,195)(216,195)])
}
Add(StrPart,16138008,284,196)
{
Char=" "
link(onPart,15436451:doCase,[])
link(Str,6488238:Right,[(290,186)(278,186)(278,235)(171,235)])
}
Add(Case,3881173,221,189)
{
Value=String(GET)
link(onTrue,16138008:doSplit,[])
}
Add(DoData,11657210,788,217)
{
Data=String(404.htm)
link(onEventData,766827:doEvent2,[])
}
Add(Hub,1788507,319,252)
{
InCount=2
link(onEvent1,2592065:doSend,[(361,258)(361,244)(101,244)(101,202)])
link(onEvent2,2592065:doCloseAll,[(371,265)(371,291)(92,291)(92,209)])
}
Add(Hub,766827,865,210)
{
InCount=2
OutCount=3
link(onEvent1,5882885:doEvent1,[(907,216)(907,195)(869,195)(869,153)])
link(onEvent2,3672149:doLoad,[(919,223)(919,167)])
link(onEvent3,11922045:doEvent1,[(916,230)(916,258)])
}
Add(StrCat,917603,592,203)
{
link(onStrCat,14904303:doFileExists,[(632,209)(632,230)])
link(Str1,13033036:Value,[])
}
Add(Memory,13033036,592,35)
{
Default=String(www)
}
Add(FormatStr,14028257,1005,210)
{
DataCount=3
Mask="%3Content-Length: %1
Keep-Alive: timeout=0, max=100
Connection: Keep-Alive
Content-Type: text/html

%2"
link(onFString,1788507:doEvent1,[(1057,216)(1057,314)(305,314)(305,258)])
link(Str2,13520680:Var2,[(1018,200)(979,200)(979,226)(948,226)])
link(Str3,2893471:Text,[])
}
Add(StrList,3672149,942,133)
{
@Hint=#17:загрузка страницы|
}
Add(Case,15436451,326,203)
{
Value=String(/)
link(onNextCase,12550920:doCase,[(391,209)(391,230)])
link(onTrue,6121418:doCollectCPUData,[(481,216)(481,279)])
}
Add(Hub,2662383,529,203)
{
InCount=2
OutCount=1
link(onEvent1,917603:doStrCat,[])
}
Add(StrCat,13418997,788,343)
{
Str2="<br>"
link(onStrCat,1071784:doEvent3,[(881,349)(881,356)])
}
Add(Replace,15323751,697,343)
{
SubStr="?"
link(onReplace,13418997:doStrCat,[])
}
Add(Hub,1071784,942,336)
{
@Hint=#8:добавить|
InCount=3
OutCount=1
link(onEvent1,3672149:doAdd,[(984,342)(984,257)(932,257)(932,139)])
}
Add(Length,4794548,956,210)
{
link(onLength,14028257:doString,[])
link(Str,13520680:Var3,[(962,200)(925,200)(925,212)])
}
Add(GetDataEx,13520680,935,203)
{
link(Data,3672149:Text,[])
}
Add(StrList,2893471,1019,140)
{
Strings=#15:HTTP/1.1 200 OK|34:Date: Wed, 0 Aug 2006 00:00:00 GMT|29:Server: mswebser/1.0.0(Win32)|42:Last-Modified: Fri, 0 Aug 2006 00:00:0 GMT|22:ETag: "0-181-44ef126c"|20:Accept-Ranges: bytes|
}
Add(FileTools,14904303,641,203)
{
link(onEnd,6281813:doCase,[])
}
Add(Case,6281813,683,203)
{
Value=Integer(1)
link(onNextCase,11657210:doData,[(774,209)(774,223)])
link(onTrue,10882250:doData,[])
}
Add(DoData,10882250,725,210)
{
link(onEventData,766827:doEvent1,[])
link(Data,917603:Result,[(731,200)(678,200)(678,246)(598,246)])
}
Add(Hub,11922045,935,252)
{
@Hint=#9:отправить|
InCount=3
OutCount=1
link(onEvent1,4794548:doLength,[(977,258)(977,247)(946,247)(946,216)])
}
Add(FormatStr,11864926,613,273)
{
DataCount=3
Mask="Страница сгенерирована программой MonSer <br>
%1<br>
На диске свободно %2 Мб<br>
Загрузка процессора %3 %<br>
Для того чтобы посмотреть список процессов допишите пароль в строке адреса"
link(onFString,1594361:doEvent1,[(660,279)(660,272)])
link(Str1,15474003:FormatTime,[(619,161)(619,161)])
link(Str2,915774:FreeSize,[(626,170)(675,170)])
}
Add(Hub,1594361,676,266)
{
OutCount=3
link(onEvent1,5882885:doEvent2,[(762,272)(766,206)(766,160)])
link(onEvent2,1071784:doEvent1,[(825,279)(825,342)])
link(onEvent3,11922045:doEvent2,[(821,286)(821,265)])
}
Add(Hub,5882885,879,147)
{
@Hint=#8:очистить|
InCount=3
OutCount=1
link(onEvent1,3672149:doClear,[(926,153)(926,146)])
}
Add(Time,15474003,613,112)
{
Format="Сегодня D.M.Y<br> Время сервера h:m:s"
}
Add(HardDisk,915774,662,112)
{
Disk="E"
Size=1
}
Add(CPUUsage,6121418,557,273)
{
link(onUsage,11864926:doString,[])
}
Add(Case,12550920,424,224)
{
Value=String(/0)
link(onNextCase,2662383:doEvent1,[(511,230)(511,209)])
link(onTrue,9601067:doEvent1,[(471,237)(471,349)])
}
Add(FormatStr,9682877,641,385)
{
DataCount=1
Mask="Страница сгенерирована программой MonSer
Список процессов:<br>"
link(onFString,1071784:doEvent2,[(926,391)(926,349)])
}
Add(EnumProcess,12895664,641,336)
{
link(onProcess,15323751:doReplace,[(685,342)(685,349)])
}
Add(Hub,9601067,571,343)
{
OutCount=4
link(onEvent1,5882885:doEvent3,[(613,349)(613,172)])
link(onEvent2,9682877:doString,[(615,356)(615,391)])
link(onEvent3,12895664:doEnum,[(622,363)(622,342)])
link(onEvent4,11922045:doEvent3,[(769,370)(769,272)])
}
карма: 1

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