Форум: "Начинающим";
Текущий архив: 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 /deleteif 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