Форум: "Начинающим";
Текущий архив: 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 интерфейс, но в этом совершенно не разбираюсь
надо учить
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.12.27;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.006 c