Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

сервис + приложение (обмен данными)


Страницы:   1 2 3

VirEx(home) ©   (2009-09-14 11:52:00) 

есть сервис (запускаемый допустим с правами system) работающий с SQLite базой

есть приложение (с ограниченными правами), которое должно обмениватся с сервисом информацией:
- добавление данных в базу
- выборка данных из базы
и т.п.

как реализовать "общение" приложения с сервисом?

сервис и приложение работают на одной машине, однако хотелось бы работа с сервисом из удаленной машины в локальной сети


VirEx(home)   (2009-11-01 10:18:00) [21]


> Eugene999   (23.10.09 15:53) [38]

спасибо, давно уже сделал по своему :)
теперь установка/запуск/остановка/удаление сервиса проще всего:
PService /create /start
PService /stop /delete

 if FindSwitch('STOP')  then _ControlService(sStop ,ServerName);
 if FindSwitch('DELETE')then begin
                               PSvc.AfterUninstall(nil);
                               _ControlService(sDelete,ServerName);
                             end;
 if FindSwitch('CREATE')then begin
                               _ControlService(sCreate,ServerName,ParamStr(0));
                               PSvc.AfterInstall(nil);
                             end;
 if FindSwitch('START') then _ControlService(sStart ,ServerName);
 
 Application.Run;



> Dennis I. Komarov ©   (23.10.09 16:00) [39]

я тоже за http интерфейс, но в этом совершенно не разбираюсь
надо учить


Dennis I. Komarov   (2009-10-23 16:00:00) [22]

За HTTP +1


Eugene999   (2009-10-23 15:53:00) [23]

функцию ControlService попробуй
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1348


Суслик_   (2009-09-23 21:50:00) [24]


> VirEx(home)   (21.09.09 22:11) [33]
>
> > Суслик_   (20.09.09 12:31) [31]
> спасибо за исходник
> жуткое зрелище :)


Жаль, что не оценил )

Единственный полностью асинхронный пример сетевого ввода-вывода между прочим )) Вернее не так: мой код - единственный пример, где в полной мере используется достоинства асинхронности в целях достижения максимальной производительности ввода-вывода.


VirEx(home)   (2009-09-22 11:37:00) [25]

> Можно подумать, что-то мешало делать тоже самое и с пом. [23])
мешало незнание как организовать асинхронную передачу

> если кому нужно: http://slil.ru/28003424
в потоке серверной части желательно вместо:

       if Assigned(FPipe.FOnData) then
         FPipe.FOnData(buf);


записать как:

     if BytesRead <> 0 then begin
       FPipe.cs.Enter;
       FPipe.FBuf:=buf;
       Synchronize(FPipe.DoOnData);
       FPipe.cs.Leave;


и сделать соответствующие изменения в компоненте :)
иначе в оконных приложениях будут ошибки


Сергей М.   (2009-09-22 08:44:00) [26]


> клиент каждый раз для отправки подключается,отключается


Зачем ? Что мешает установить один раз установить соединение и гонять по нему туда-сюда сообщения ?


> в новом потоке) - будет "конкуренция"


Пайпы-то причем ?
Не они же являются причиной "конкуренции"..


> принцип: один раз подключаемся и сколь угодно отправляем
> информацию


Можно подумать, что-то мешало делать тоже самое и с пом. [23])


VirEx(home)   (2009-09-21 22:51:00) [27]

если кому нужно: http://slil.ru/28003424
простая но рабочая реализация именованных каналов
компонент создает свой пайп (для остальных) и может записывать в "чужой" пайп

принцип: один раз подключаемся и сколь угодно отправляем информацию

каждая клиентская запись в канал инициирует на сервере событие OnData(Data:string)


VirEx(home)   (2009-09-21 22:11:00) [28]

> Суслик_   (20.09.09 12:31) [31]
спасибо за исходник
жуткое зрелище :)

вобщем сделал по принципу http://www.delphimaster.ru/articles/named_pipes/index.html

> И где тут "конкурирующие записи в пайп" ?

если клиент каждый раз для отправки подключается,отключается
и сервер для каждого подключения создает новый экземпляр пайпа (в новом потоке) - будет "конкуренция"

отправляешь:
1
2
3

на сервере может придти как
3
1
2

мне это не подходит, поэтому сделал как в примере (выше по линку):
1. запуск и подключение клиента
2. асинхронная отправка (по событию)
3. отключение от сервера и завершение работы клиента


Сергей М.   (2009-09-21 08:27:00) [29]


> VirEx(home)   (19.09.09 21:54) [26]


И где тут "конкурирующие записи в пайп" ?
Не вижу никакой "конкуренции" ..


Суслик_   (2009-09-20 12:31:00) [30]


> VirEx(home)   (20.09.09 11:23) [29]


Посмотри мой пример, одновременно читая справку из МСДН.
У меня раньше много было комментов в коде, потом убрал, ибо прочитавшему МСДН будет все понятно, а не прочитавшему не будет понятно ничего даже по комментам.

В общем, МСДН в зубы )

Если интерес у тебя к вопросу серьезный, то нужно потратить денек-второй на изучение МСДН. Я помню когда писал транспорт в некоторые вопросы не сразу врубился.


>
> как на стадии 3 после записи строки1 уведомить сервер что
> запись закончилась и нужно ожидать вторую запись?


Опять же смотри МСДН. Там есть 2 режима передача - сообщения и поток. У каждого свои ограничения. Я использую второй. Обычно в начале длину передавать надо.


Inovet   (2009-09-20 11:59:00) [31]

> [29] VirEx(home)   (20.09.09 11:23)
> как на стадии 3 после записи строки1 уведомить сервер что
> запись закончилась и нужно ожидать вторую запись?

Например, длину вначале передать


VirEx(home)   (2009-09-20 11:23:00) [32]

> Named Pipes?

застрял на них

сначало было так:
1. сервер создает именованый канал
2. клиент подключается, передает строку, отключается

если создать клиента в событии кнопки:
begin
1. создание клиента
2. подключение
3. запись строки в канал
4. отключение клиента

5. подключение клиента <- вот тут ошибка "все экземпляры каналов заняты"
6. запись строки в канал
7. отключение клиента
end;

пробовал в сервере при подключении клиента создавать новый поток и читать оттуда, ошибка всеравно проявляется

сейчас пробую сделать по другому:
1. создание клиента
2. подключение
3. запись строки1 в канал <- при этом в канал записываются строка1 и строка2, два в одном :(
4. запись строки2 в канал
5. отключение клиента

как на стадии 3 после записи строки1 уведомить сервер что запись закончилась и нужно ожидать вторую запись?


Юрий Зотов   (2009-09-20 11:03:00) [33]

> хотелось бы работа с сервисом из удаленной машины в локальной сети

Named Pipes?
Or Sockets?
:o)


Суслик_   (2009-09-20 02:14:00) [34]

именованные каналы однозначно.

могу дать реализацию, если надо, пиши на timokhov ...............gmail.................com


VirEx(home)   (2009-09-19 21:54:00) [35]

сервер создает пайп

клиент пишет в пайп:
writefile() - str1
writefile() - str2

сервер получает либо str1 либо str2

если клиент запишет так:
writefile() - str1
sleep(1000)
writefile() - str2

то сервер получает обе строки


Сергей М.   (2009-09-19 21:21:00) [36]


> конкурирующие записи в пайп


Чавой-то ?
Что еще за зверь ?)


VirEx(home)   (2009-09-19 21:10:00) [37]

> Думаешь тем самым отодвинуть приближение катастрофы ?

есть только одна катастрофа - конкурирующие записи в пайп незнаю как обработать
один из двух успевает передать данные :(

> В преддверии катастрофы любой сойдет за хороший)
спасибо, гляну, может обойду данную проблему


Сергей М.   (2009-09-19 16:42:00) [38]


> вобщем пересылаю как одну строку


Думаешь тем самым отодвинуть приближение катастрофы ?


> посоветуйте ..компонент


В преддверии катастрофы любой сойдет за хороший)
http://r3code.livejournal.com/117012.html


VirEx(home)   (2009-09-19 14:02:00) [39]

вобщем пересылаю как одну строку

пересылающий кодирует информацию из:
ClientName=Pipe1
ClientHost=.
Command=AddLines
Param1=asdf
Param2=zxcv

в:
'ClientName=Pipe1#1ClientHost=.#1Command=AddLines#1Param1=asdf#1...'
посредством небольшого парсера

тоесть "строки" разделяются непечатаемым символом

на строне клиента все расшифровывается:

procedure TPSvc.OnData(ClientHost,ClientNamePipe:string; Data:TParser);
var
 Week: TWeek;
begin
//обрабатываем сообщения от клиента

case Data.GetCommand of
 cAddScript     : if FScheduler.NewScript(Data.GetName,Data.GetComment,Data.GetSource) then
                    FPipe.Redirect;
 cDeleteScript  : if FScheduler.DeleteScript(Data.GetName) then
                    FPipe.Redirect;
 cAddSchedule   : begin
                    Week:=Data.GetWeek;
                    if FScheduler.NewSchedule(Data.GetScriptName,Data.GetRunTime,Data.GetPeriod,Week) then
                    FPipe.Redirect;
                  end;
 cDeleteSchedule:if FScheduler.DeleteSchedule(Data.GetID) then
                   FPipe.Redirect;
end;

end;

всем спасибо за безмолвную поддержку :)


VirEx(home)   (2009-09-19 08:30:00) [40]

знаю что чудовищно
но мнение это не ответ

подскажите как правильно "собрать" пакет для отправки, и как его "разобрать"


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо