Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TDbxConnection и TDSServerModule в DataSnap / 14 сообщений из 14, страница 1 из 1
09.02.2011, 08:48
    #37105779
v.kirilin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TDbxConnection и TDSServerModule в DataSnap
Добрый день!

Бьюсь уже достаточно давно, но решения так и не нашёл. Google ответа не дал.

Имеем:
Сервер приложений, написанный на Delphi 2010. Протокол TCP/IP.

Проблема:
Не могу увязать созданный сервером экземпляр TDSServerModule с клиентом, который инициировал соединение.
Нужно из этого DSServerModule получить доступ к нужному DbxConnection или хотя бы наоборот... И где искать список этих самых DbxConnection'ов?

А то сейчас приходится, например, имя пользователя передавать из клиента 2 раза - при подключении и ещё через процедуру в DSServerModule.

Может кто знает, в какую сторону копать?
...
Рейтинг: 0 / 0
09.02.2011, 11:21
    #37106144
Michael Longneck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TDbxConnection и TDSServerModule в DataSnap
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
 procedure  TAppSrvDSService.DataSnapServerConnect(DSConnectEventObject: TDSConnectEventObject);
 var 
  Conn: TIdTCPConnection;
  sProtocol: String ;
  Protocol:Integer;
 begin 
   sProtocol := DSConnectEventObject.ConnectProperties.Values['Protocol'];
    if   not  TryStrToInt(sProtocol, Protocol)  then  Protocol :=  0 ;

   Trace( 'Protocol:' + IntToStr(Protocol));
    if  Protocol < Options.MinProtocol  then 
    begin 
      raise  Exception.CreateFmt('Minimal protocol %d. Your is %d.' + sLineBreak +
                               ' Upgrade your application.' , [Options.MinProtocol, Protocol]);
    end ;
   Conn := TIdTCPConnection(DSConnectEventObject.ChannelInfo.Id);
   Trace('Client ' + Conn.Socket.Binding.PeerIP +':' + IntToStr(Conn.Socket.Binding.PeerPort));
   Trace('Client info: ' + DSConnectEventObject.ChannelInfo.Info);
   ContextList.AddConnection(Conn);
 end ;

Не наведёт на мысли?
...
Рейтинг: 0 / 0
09.02.2011, 12:57
    #37106459
v.kirilin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TDbxConnection и TDSServerModule в DataSnap
Michael Longneck, Спасибо!
Конечно наведёт!

Но в момент коннекта, я ведь всё равно ничего не знаю об экземпляре TDSServerModule, он ещё не создан и передать никакую информацию о соединении не могу...

Вижу, Michael, что вы в теме, поэтому попутно ещё вопрос:

Не навредит ли чему-нибудь, если я буду ручками создавать и уничтожать этот самый TDSServerModule таким образом:

procedure TServerContainer1.DSServerClass1CreateInstance(
DSCreateInstanceEventObject: TDSCreateInstanceEventObject);
begin
DSCreateInstanceEventObject.ServerClassInstance := TServerMethods1.Create(nil);
end;

procedure TServerContainer1.DSServerClass1DestroyInstance(
DSDestroyInstanceEventObject: TDSDestroyInstanceEventObject);
begin
DSDestroyInstanceEventObject.ServerClassInstance.Free;
DSDestroyInstanceEventObject.ServerClassInstance := nil;
end;

Проверил, вроде бы ничего не рушится. Если это легитимные действия, то это решит некоторые пои проблемы.
Хотя информацию об ChannelInfo, видимо, я здесь получить не могу?
...
Рейтинг: 0 / 0
09.02.2011, 13:35
    #37106603
Michael Longneck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TDbxConnection и TDSServerModule в DataSnap
Создавать руками можно. Вы, я, так понимаю в TSQLConnection в параметрах хотите передать имя пользователя, а потом ассоциировать с экземпляром? Их есть у меня. Я бился тоже, а потом применил обходной манёвр.

Вот у этого события - DataSnapServerConnect и у кода внутри экземпляра DSServerModule есть одно общее дело - они в одном потоке исполняются. Поэтому заведите словарь контекстов с ключом по ThreadID. И в каждом событии положите в него нужные значения - instance of TDSServerModule , idConnection и прочая. Только, естественно, синхронизируйтесь при доступе.
...
Рейтинг: 0 / 0
09.02.2011, 13:40
    #37106624
v.kirilin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TDbxConnection и TDSServerModule в DataSnap
Michael LongneckСоздавать руками можно. Вы, я, так понимаю в TSQLConnection в параметрах хотите передать имя пользователя, а потом ассоциировать с экземпляром? Их есть у меня. Я бился тоже, а потом применил обходной манёвр.

Вот у этого события - DataSnapServerConnect и у кода внутри экземпляра DSServerModule есть одно общее дело - они в одном потоке исполняются. Поэтому заведите словарь контекстов с ключом по ThreadID. И в каждом событии положите в него нужные значения - instance of TDSServerModule , idConnection и прочая. Только, естественно, синхронизируйтесь при доступе.

ООО!!!
Вот это да! Спасибо огромнейшее!
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
16.10.2018, 13:00
    #39718088
ameise
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TDbxConnection и TDSServerModule в DataSnap
Michael Longneck,
...Поэтому заведите словарь контекстов с ключом по ThreadID,
не подскажите как добраться до ThreadID в событии DSServer1Connect
был бы очень благодарен, что то никак не могу сообразить
...
Рейтинг: 0 / 0
16.10.2018, 13:23
    #39718127
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TDbxConnection и TDSServerModule в DataSnap
Код: pascal
1.
TThread.CurrentThread.ThreadID
...
Рейтинг: 0 / 0
16.10.2018, 14:59
    #39718207
ameise
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TDbxConnection и TDSServerModule в DataSnap
X-Cite,
прошу прощения за неточный вопрос. Дело в том что хотельсь бы решение в контексте создания коннекта. Там есть объект TDSConnectEventObject,.. и вот там образом мы добираемся до параметров коннекта:
Код: pascal
1.
2.
3.
4.
ure TServerContainer1.DSServer1Connect(DSConnectEventObject: TDSConnectEventObject);
var hConn: TIdTCPConnection;
begin
hConn := TIdTCPConnection(DSConnectEventObject.ChannelInfo.Id);


есть подозрение, что DSConnectEventObject.ChannelInfo.Id и есть этот идентификатор,
Может есть какой то способ добраться до ThreadID в данном контексте?
...
Рейтинг: 0 / 0
16.10.2018, 15:27
    #39718233
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TDbxConnection и TDSServerModule в DataSnap
Michael LongneckВот у этого события - DataSnapServerConnect и у кода внутри экземпляра DSServerModule есть одно общее дело - они в одном потоке исполняются.
Если верить этому, то вариант с TThread.CurrentThread.ThreadID вернет вам идентификатор нити в рамках которой вызывается событие DSServer1Connect
...
Рейтинг: 0 / 0
16.10.2018, 15:43
    #39718247
ameise
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TDbxConnection и TDSServerModule в DataSnap
X-CiteMichael LongneckВот у этого события - DataSnapServerConnect и у кода внутри экземпляра DSServerModule есть одно общее дело - они в одном потоке исполняются.
Если верить этому, то вариант с TThread.CurrentThread.ThreadID вернет вам идентификатор нити в рамках которой вызывается событие DSServer1Connect

спасибо. что то возвратил, ..номер каждый раз разный.
меня просто смущает такое обращение к классу TThread, т.е. фактически к описанию класса, а не экземпляра класса.., почему он вообще не nil?
...
Рейтинг: 0 / 0
16.10.2018, 15:46
    #39718248
ameise
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TDbxConnection и TDSServerModule в DataSnap
не подскажите в образовательных целях что можно посмотреть по этой теме,... не конкретно эта задача, а почему так можно обращаться к описанию класса,. а не к его экземпляру
...
Рейтинг: 0 / 0
16.10.2018, 15:54
    #39718249
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TDbxConnection и TDSServerModule в DataSnap
...
Рейтинг: 0 / 0
16.10.2018, 15:54
    #39718250
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TDbxConnection и TDSServerModule в DataSnap
...
Рейтинг: 0 / 0
16.10.2018, 16:52
    #39718286
ameise
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TDbxConnection и TDSServerModule в DataSnap
спасибо
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TDbxConnection и TDSServerModule в DataSnap / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]