Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.12.27;
Скачать: [xml.tar.bz2];

Вниз

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

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


 
VirEx(home)   (2009-11-01 10:31) [41]

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

как сделать чтобы поток "переключался" на работу от пользовательских прав, в том числе и от прав работающего в системе пользователя

реализация в потоке что-то типа команды:
ShitchToUserRight("User1","passw");
showmessage();
ShitchToSystemRight;


 
sniknik ©   (2009-11-01 10:35) [42]

> http + xml
> За HTTP +1
за http/или https, но - xml.

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

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


 
Юрий Зотов ©   (2009-11-01 11:26) [43]

> VirEx(home)   (01.11.09 10:31) [41]

Подобную задачу делал так:

1. Все работает через сокеты.
2. Сервис слушает порт.
3. Клиент коннектится на этот порт.
4. Сервис порождает поток, обслуживающий клиента и снова слушает порт.
5. Клиент передает потоку логин и пароль.
6. Поток коннектится к БД от имени (и с правами) клиента.
7. Клиент и поток обмениваются данными по установленному протоколу, при этом поток работает с БД.
8. Клиент отконнектился - поток умирает.


 
VirEx(home)   (2009-11-01 15:32) [44]


> Юрий Зотов ©   (01.11.09 11:26) [43]

тоже самое делается через пайпы
но мне нужен пароль и пользователь не для базы, а немного другое

чтобы сам поток мог выполнять задачи от учетной записи в системе


 
VirEx(home)   (2009-11-01 15:45) [45]


> чтобы сам поток мог выполнять задачи от учетной записи в
> системе


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


 
Юрий Зотов ©   (2009-11-01 16:10) [46]

> VirEx(home)   (01.11.09 15:32) [44]

> чтобы сам поток мог выполнять задачи от учетной записи в системе

Не думаю, что такое возможно. Поток живет внутри процесса, а процесс запущен от имени какого-то юзера - весь.

Но можно вместо потока (или ИЗ потока) порождать процесс - CreateProcessAsUser, CreateProcessWithLogonW.


 
VirEx(home)   (2009-11-01 16:16) [47]


>  [46] Юрий Зотов ©   (01.11.09 16:10)

сервис работает от прав которые выше чем у администратора, разве нет функционала API позволяющего менять права потоку на пониженные (администратор, гость и т.п.)?


 
Loginov Dmitry ©   (2009-11-01 21:49) [48]

> разве нет функционала API позволяющего менять права потоку
> на пониженные (администратор, гость и т.п.)?


права закрепляются за приложением при его запуске. Эти же права действуют
для каждого из потоков. Врядли в API предусмотрено изменение прав для
определенных потоков. Имхо, только [46].


 
DVM ©   (2009-11-01 21:53) [49]


> разве нет функционала API позволяющего менять права потоку
> на пониженные (администратор, гость и т.п.)?

Уже запущенному насколько я знаю нет.


 
brother ©   (2009-11-02 05:08) [50]

> выше чем у администратора

это system что-ли?


 
VirEx(home)   (2009-11-02 12:50) [51]


>  [50] brother ©   (02.11.09 05:08)
> > выше чем у администратора
>
> это system что-ли?

насколько я знаю, да


 
Медвежонок Пятачок ©   (2009-11-02 12:54) [52]

сервис работает от прав которые выше чем у администратора, разве нет функционала API позволяющего менять права потоку на пониженные (администратор, гость и т.п.)?

что мешает сразу запустить из под нужной учетки имеющей нужные права?


 
VirEx(home)   (2009-11-02 13:08) [53]


>  [52] Медвежонок Пятачок ©   (02.11.09 12:54)
> что мешает сразу запустить из под нужной учетки имеющей
> нужные права?

сервис выполняет скрипты

необходимо чтобы скрипт мог "переключатся" на учетку администратора например, чтобы засветить диалоговое окно
см [41], там пример команд в скрипте


 
Anatoly Podgoretsky ©   (2009-11-02 13:13) [54]

Impersonate


 
Медвежонок Пятачок ©   (2009-11-02 14:20) [55]

мда. странный сервис.


 
VirEx(home)   (2009-11-05 11:00) [56]


>  [55] Медвежонок Пятачок ©   (02.11.09 14:20)
> мда. странный сервис.

ничего странного

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


 
Dennis I. Komarov ©   (2009-11-05 12:32) [57]


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

это наименьшее из того, что придется учить


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

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

А вообще, больно нехорошо все это пахнет...


 
VirEx(home)   (2009-11-06 11:05) [58]


>  [57] Dennis I. Komarov ©   (05.11.09 12:32)
> А вообще, больно нехорошо все это пахнет...

это диплом :)


 
Медвежонок Пятачок ©   (2009-11-06 14:19) [59]

ничего странного

сервис должен работать автономно.
максимум что можно - реагировать на запросы интерактивного юзера.
но вываливать диалоговые окна по своей инициативе - никогда.


 
Dennis I. Komarov ©   (2009-11-06 14:25) [60]


> но вываливать диалоговые окна

"А хвостатым документов вообще не положено" (С)



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

Форум: "Начинающим";
Текущий архив: 2009.12.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.62 MB
Время: 0.011 c
3-1232538063
Patrick1968
2009-01-21 14:41
2009.12.27
Параметр хранимой процедуры


15-1256455692
Киря
2009-10-25 10:28
2009.12.27
Треугольник


2-1257412157
zorik
2009-11-05 12:09
2009.12.27
xml отчеты word


1-1229944689
dmitry_12_08_73
2008-12-22 14:18
2009.12.27
Получение ссылки на файл после нажатия в проводнике "Копировать"


15-1256468342
_
2009-10-25 13:59
2009.12.27
3D графика в Turbo Pascal 7.0





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский