![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
сервис + приложение (обмен данными)
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]знаю что чудовищно
но мнение это не ответ
подскажите как правильно "собрать" пакет для отправки, и как его "разобрать"