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



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

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

Наверх





Память: 0.55 MB
Время: 0.006 c
15-1256516503
POOP
2009-10-26 03:21
2009.12.27
Почему при печати pdf


15-1256651126
Ьу
2009-10-27 16:45
2009.12.27
Как линейно интерполировать значение между тремя точками.


2-1257695352
Семен Кевларвестов
2009-11-08 18:49
2009.12.27
AssignFile и файл с юникодом в имени


15-1256765411
Юрий
2009-10-29 00:30
2009.12.27
С днем рождения ! 29 октября 2009 четверг


4-1226246501
sqrttrqs
2008-11-09 19:01
2009.12.27
вывод изображения на печать





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский