Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.12.27;
Скачать: CL | DM;

Вниз

сервис + приложение (обмен данными)   Найти похожие ветки 

 
VirEx(home)   (2009-09-14 11:52) [0]

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

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

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

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


 
Сергей М. ©   (2009-09-14 12:00) [1]

Приложению этому что-то мешает работать с СУБД-сервером напрямую ?
Или сервис играет роль App-сервера ?


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


Лучшим решением будет использование TCP или UDP в кач-ве транспортных протоколов.


 
VirEx(home)   (2009-09-14 12:08) [2]

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

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

> Лучшим решением будет использование TCP или UDP в кач-ве транспортных протоколов.
спасибо, а то читаю тут про различные реализации RPC, голову ломаю что взять на вооружение


 
clickmaker ©   (2009-09-14 12:11) [3]

> читаю тут про различные реализации RPC,

а чем не вариант?
если в рамках локальной сети, то можно сервис сделать com-сервером и общаться с ним, просто вызывая методы


 
Сергей М. ©   (2009-09-14 12:17) [4]

Для лок.сети, возможно, идеальным решением в этом случае будет
http://ru.wikipedia.org/wiki/SOAP


 
VirEx(home)   (2009-09-14 12:17) [5]

> clickmaker ©   (14.09.09 12:11) [3]

а не сложно это?
а то боюсь застрянуть с разработкой этого дела


 
Сергей М. ©   (2009-09-14 12:21) [6]


> clickmaker ©   (14.09.09 12:11) [3]


В лок.сети вполне могут быть и станции, никаким боком не поддерживающие COM.


 
clickmaker ©   (2009-09-14 12:22) [7]

> [6] Сергей М. ©   (14.09.09 12:21)

то есть? линух что-ли?
ну так сервис-то виндозный


 
Медвежонок Пятачок ©   (2009-09-14 12:23) [8]

http + xml


 
Сергей М. ©   (2009-09-14 12:28) [9]


> clickmaker ©   (14.09.09 12:22) [7]


> сервис-то виндозный


Сервис-то виндозный, а обращаться к нему, вполне возможно, придется и не из-под виндовой среды.

Кстати, и виздозный сервис тоже под сомнением в плане перспектив  - а ну как приспичит пользовать его под линухом ? А он уже заточен под  взаимодействие с ним через COM.. Врагу ж не пожелаешь такого геморроя - переделывать все это хозяйство)


 
KSergey ©   (2009-09-14 15:36) [10]

> Сергей М. ©   (14.09.09 12:28) [9]
> а обращаться к нему, вполне возможно,  придется и не из-под виндовой среды.

Можно много чего нафантазировать за автора, но смысл? :)


 
Сергей М. ©   (2009-09-14 15:52) [11]


> но смысл?


Смысл - подсказать автору тропинку, на которой или граблей спрятано поменьше или бьют они не так больно)


 
clickmaker ©   (2009-09-14 15:53) [12]

> или бьют они не так больно)

с обитой поролоном рукоятью )


 
Сергей М. ©   (2009-09-14 16:02) [13]


> с обитой поролоном рукоятью


или сбитым прицелом)


 
Anatoly Podgoretsky ©   (2009-09-14 16:30) [14]

> Сергей М.  (14.09.2009 15:52:11)  [11]

Или бьют через раз и через раз будет удовольствие.


 
VirEx(home)   (2009-09-18 19:25) [15]

застрял на обмене данными

посоветуйте хороший компонент pipe для чтения/записи данных как клиентской части так и серверной

чтото типа такого:
TPipe=class
public
 function SendString():Boolean;
published
 property OnData(...,var Result:Boolean)

var
server:TPipe;
client:TPipe;
begin
server:=TPipe.Create(".","ServerPipe");
server.OnData:=Form1.OnData;
client:=TPipe.Create(".","ClientPipe");
...
if not client.SendString("ServerPipe",...) then ;
end;

procedure Form1.OnData(...ClientName,var Result:Boolean);
begin
//при установке Result:=False клиент в функции client.SendString() получит отрицательный результат
if ... then Result:=True else Result:=False;
...
SendString(ClientName,...)
end;

либо посоветуйте компонент на сокетах
осталось мало времени :(


 
Сергей М. ©   (2009-09-18 20:19) [16]


> осталось мало времени


Неужто Апокалипсис завтра после обеда ?


 
VirEx(home)   (2009-09-18 20:33) [17]

> Неужто Апокалипсис завтра после обеда ?
дипломус сдавать через 1,5 недели

еще вопрос знатокам
в отдельном потоке читаю то что клиент послал через
ReadFile(FRead,FBuf,BUFFERSIZE-1, FBread,nil);

как например уведомить его (клиента) что его WriteFile прошел с ошибкой?
возможно есть что-нибудь вроде SendSignal(FRead...)?

FRead это stdin:
CreatePipe(FRead,FWrite,nil,0)


 
VirEx(home)   (2009-09-18 20:56) [18]

> CreatePipe(FRead,FWrite,nil,0)

от блин :(
опять переделывать


 
VirEx(home)   (2009-09-18 23:06) [19]

вопрос по поводу указателей

 TPacked=packed record
   ClientName:PChar;
   Data:PChar;
 end;
 PPacked=^TPacked;

<br>отправка:</br>
var
 P:PPacked;
 Len:integer;
begin
cs.Enter;
new(p);
Len:=SizeOf(TPacked);
getmem(p^.ClientName,Length(self.FNamePipe)*SizeOf(Pchar));
p^.ClientName:=StrPCopy(p^.ClientName,self.FNamePipe);
Inc(Len,Length(self.FNamePipe)*SizeOf(Pchar));
getmem(p^.Data,Length(Data)*SizeOf(Pchar));
p^.Data:=StrPCopy(p.Data,Data);
Inc(Len,Length(Data)*SizeOf(Pchar));

WriteFile(hPipe, p^, Len, dwWritten, nil);

<br>прием:</br>
const
  BUFFERSIZE=4096;

var
FBuf: array[0..BUFFERSIZE] of byte;
s1,s2:string;

begin
ReadFile(FHandle, FBuf, BUFFERSIZE, FBread, nil)

s1:=PPacked(@FBuf)^.ClientName;
s2:=PPacked(@FBuf)^.Data;

в одном приложении такой обмен между пайпами проходит без ошибок, но если из двух разных приложений обмен - выходят каракули :(

подскажите как правильно передать пакет (TPacked)


 
Медвежонок Пятачок ©   (2009-09-19 00:43) [20]

Чудовищно. С большой и жирной буквы "ЧЕ"


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

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

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


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

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

пересылающий кодирует информацию из:
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;

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


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


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


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


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


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


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

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

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

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


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


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


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


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

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

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

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

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

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


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

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

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


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

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

Named Pipes?
Or Sockets?
:o)


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

> Named Pipes?

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

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

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

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

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

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

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


 
Inovet ©   (2009-09-20 11:59) [30]

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

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


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


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


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

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

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


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


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


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


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


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


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

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

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

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

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

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

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

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


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

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

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

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


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


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


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


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


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


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


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


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

> Можно подумать, что-то мешало делать тоже самое и с пом. [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-23 21:50) [37]


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


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

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


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

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


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

За HTTP +1


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


> 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 интерфейс, но в этом совершенно не разбираюсь
надо учить



Страницы: 1 2 вся ветка

Текущий архив: 2009.12.27;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.018 c
2-1257856549
Kolan
2009-11-10 15:35
2009.12.27
Самодельная отрисовка мигает


1-1231824463
inferno
2009-01-13 08:27
2009.12.27
Передать параметром процедуре указатель на массив


2-1252914724
VirEx(home)
2009-09-14 11:52
2009.12.27
сервис + приложение (обмен данными)


2-1257847652
Alex_C
2009-11-10 13:07
2009.12.27
По Handle окна найти окно


1-1231565298
2009Man
2009-01-10 08:28
2009.12.27
как определить компонент на который перетащили файлы