powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / OPEN,USE,READ,WRITE-"клиент-сервер" через "TCP Binding"
21 сообщений из 21, страница 1 из 1
OPEN,USE,READ,WRITE-"клиент-сервер" через "TCP Binding"
    #34675608
decaml
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотелось попробовать сделать "клиент-серверный" вызов функции на сервере через "TCP Binding" между 2-мя Сache и вернуть результаты.
Есть пример:
в одном терминале если запустить: do server^test
и в другом терминале если запустить: do client^test
- то дейстивтельно, на клиент идет номер $JOB из child - это зашито в server^test

Вопрос: - а как из клиента "запросить" значение глобала или результат функции с сервера?
Нет ли у кого примера ?
заранее большое спасибо

test.int
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
 
server
  SET io="|TCP|1" 
  SET ^serverport= 7001  
  OPEN io:(:^serverport:"MA"): 200  
  IF ('$TEST) { 
       WRITE !,"Cannot open server port" 
       QUIT }
  ELSE { WRITE !,"Server port opened" }
 ;---------------------------------------------------------  
loop
     USE io READ x ; Read for accept 
     USE 0 WRITE !,"Accepted connection" 
     JOB child:(:5:io:io) ;Concurrent server bit is on 
     GOTO loop
 ;---------------------------------------------------------  
child
  WRITE $JOB_"+",! ; Send job id on TCP device to be read by client 
  QUIT
 ;---------------------------------------------------------  
client
  SET io="|TCP|2" 
  SET host="127.0.0.1" 
  OPEN io:(host:^serverport:"M"):200 ;Connect to server
   IF ('$TEST) { 
       WRITE !,"cannot open connection" Quit }
   ELSE { 
       WRITE !,$TEST,"Client connection opened" 
       USE io READ x ;Reads from subjob 
       }
       
   IF ('$TEST) { 
   USE  0 
       WRITE !,"No message from child" 
       CLOSE io 
       QUIT }
   ELSE {
       USE  0  WRITE !,"Child is on job ",x 
       CLOSE io 
       QUIT }
...
Рейтинг: 0 / 0
OPEN,USE,READ,WRITE-"клиент-сервер" через "TCP Binding"
    #34675640
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собсно как запрограммуеш. Передаются у тебя строки.

Из строк сооружаеш протокол. Мы гоняли списки ЕМНИП.

А так уже дело твое - тут возращаем глабал тут выполняем Query. Без "протокола" никак.
...
Рейтинг: 0 / 0
OPEN,USE,READ,WRITE-"клиент-сервер" через "TCP Binding"
    #34675775
decaml
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PtnСобсно как запрограммуеш. Передаются у тебя строки.


да вот что-то ни одной попытки передать запрос клиента на сервер и получить ответ обратно пока не получилось

Как все эти READ-WRITE-ы нужно нарисовать? Чтобы к примеру клиент посылает строку - нужен глобал ^Pluk - сервер читает и отправляет ответ
...
Рейтинг: 0 / 0
OPEN,USE,READ,WRITE-"клиент-сервер" через "TCP Binding"
    #34676245
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чет не помню что означает модификатор М для опен - я использовал S

Далее пишу две низкоуровневые процедуры, собсно это класс одинаково используемый как на клиенте так и на сервере - способ соединения токо разный.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
%read()
 n ozt,oio,y,l,len s ozt=$ZT,$ZT="%readErr",oio=$IO
 u device r y# 2 :Timeout e  s Status= 0 ,$ZT=ozt u oio  q ""
 s len=+($A(y, 1 )* 256 )+$A(y, 2 ) s y=len# 31990  ; проверка на длину строки и заодно переполнение буфера
 r l#(y):Timeout e  s Status= 0 ,$ZT=ozt u oio  q ""
 s Status= 1  u oio q l
%readErr s Status=- 1 ,$ZT=ozt,Connected= 0  u oio  q ""
 q ""

%write(astr) s astr=$g(astr,"")
 i 'Connected s Status=- 1  q Status
 n ozt,oio,l s ozt=$ZT,$ZT="%writeErr",oio=$IO,l=($l(astr)# 31990 ) ; проверка на длину строки и заодно переполнение буфера
 u device w $C(l\ 256 ,l# 256 ),$e(astr, 0 ,l) w ! s $ZT=ozt u oio s Status= 1  q Status
%writeErr s $ZT=ozt,Connected= 0  u oio s Status=- 1  q Status
 q ""

Осторожно токо буковки смотри - а то букву L иногда можно за 1-цу принять

Основная идея - посылаем два байта длины и строку данных. Ограничения на 32К - от каши.

В строке у меня например листбилд...
-Команда
-не помню чего :)
-не помню чего :)
-не помню чего :)
-данные
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
TRead() ;
 n str 
TReadLoop s str=$$%read() q:(Status< 1 ) "" s Command=$lg(str, 1 ) 
 i Command= 1  s $li(str, 1 )= 2  d %write(str) g TReadLoop ; пинг спросили отошлем дальше и будес слушать все остальное
 i Command= 2  q $li(str, 2 , 5 )    ; пинг вернулся - отдали данные без  1 -го элемента - комманды
 i Command= 3  q $lg(str, 5 )      ; данные пришли
 q ""

TWrite(astr) s astr=$g(astr,"")
 d %write($lb( 3 ,"","","",astr)) i Status= 1  s Command= 3 
 q Status

А у ж что по команде делать дело ваше - глобал читать, JOB запускать, запрос выполнять
...
Рейтинг: 0 / 0
OPEN,USE,READ,WRITE-"клиент-сервер" через "TCP Binding"
    #34676292
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тут процедуры описанные выше - внутри объекта %connection
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
// Клиент
d %connection.TWrite($lb("GSA:READ","^Pluk")
for   {
 set ret=%connection.TRead() quit:%connection.Status'=1 
 set comand=$lg(ret,1) quit:comand'="GSA:READOK"  
 w "Узел :",$lg(ret, 2 )
 w " = ",$lg(ret, 3 ),!
}

//Сервер
s str=%connection.TRead() 
if $lb(str, 1 )="GSA:READ"  {
 d GSAREAD($lb(str, 2 ))
}elseif  0 = 1  {
 // ...
}

GSAREAD(glb)
 new var,ret
 set $ZT="GSAREADerr"
 set var=$g(glb)
 set ret=$g(@var)
 for { set ret=$q(@ret) quit:ret="" 
  d %connection.TWrite($lb("GSA:READOK",ret,$g(@ret))
 }
 set $ZT=""
 q
GSAREADerr
 set $ZT=""
 q 
...
Рейтинг: 0 / 0
OPEN,USE,READ,WRITE-"клиент-сервер" через "TCP Binding"
    #34676314
Зет
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЗЫ: блин ну ошибок же понаписал таварищ Птн впопыхах :))
...
Рейтинг: 0 / 0
OPEN,USE,READ,WRITE-"клиент-сервер" через "TCP Binding"
    #34677073
decaml
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ptn для опен - я использовал S

а где-же в примере OPEN и IP сервера?
"обьект %connection" - это что такое? что-то ни в студии, ни в доках пока не нашел
...
Рейтинг: 0 / 0
OPEN,USE,READ,WRITE-"клиент-сервер" через "TCP Binding"
    #34677167
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
decaml"обьект %connection" - это что такое? что-то ни в студии, ни в доках пока не нашел
Ptn ... собсно это класс одинаково используемый как на клиенте так и на сервере - способ соединения токо разный.

Елки палки :) это объект совбственно-ручно написанного класса который генерит слушающший процесс и в котором инкапсулированы функции чтения записи и разбора "протокола" первого уровня.

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

decamlа где-же в примере OPEN и IP сервера?

на клиенте
Код: plaintext
 o ..device:(..host:..port:"S"):..Timeout 

на сервере
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
 
// открытие и ожидание
o io:("":port:"SA"):Timeout 
// запуск конкрурентных запросов
loop u io r x ;Read for accept 
 j childstart($j,log):(: 5 :io:io) ;  Concurrent server bit is on
 // еще нужен код по выключению сервера
 g loop 

// процедура запуска детишек
childstart(serverjob,slog)
 // внутри ChildLoop создается %connection и процедура может отдавать данные
 d ..ChildLoop(serverjob,slog)
 q


Общая схема такова
Регистред Класс -> внутри параметры соединения и методы
Read
Write
OpenConnection
Close
ServerStart
и т.д.

На клиенте
Код: plaintext
1.
2.
3.
4.
5.
set con=##class(класс).%New()
if con.OpenConnection("127.0.0.1","3333") {
 d %connection.TWrite($lb("GSA:READ","^Pluk")
}
set con=""

На сервере
Код: plaintext
1.
do ##class(класс).ServerStart("3333")

после чего задача сервера обеспечивает существование объекта %coonection (аля %session и %request) связанного с запрашиваемым узлом для каждого форкнутого соединения.

Класс просто удобен тем что в него запихиваеш начальный протокол обмена - а потом сверху и ваяеш если что нужно. ООП как никак.
...
Рейтинг: 0 / 0
OPEN,USE,READ,WRITE-"клиент-сервер" через "TCP Binding"
    #34677560
decaml
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну понял, спасибо, тут надо вкуривать и вкуривать, наверно месяца 2,
гибкая технология - и обьекты, и sql-шлюз, но на cos пока спросить данные у Cache задача не из легких

а вроде хотел то, чтобы csp-страничка в зависимости от запроса юзера
читала данные с разных ecp-клиентов
...
Рейтинг: 0 / 0
OPEN,USE,READ,WRITE-"клиент-сервер" через "TCP Binding"
    #34678138
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Э-э-э

Вы ж уже создавали вопрос на эту тему ... и вызов и ЕСП... и это совсем другой отдельный коленкор.

Работать напрямую с ECP нельзя - протокол как бы закрытый. Но что мешает использовать его в стандартной кофигурации непонятно...

Что же до простой CSP страницы - то :

1 - можно делать просто редирект на интересующий вас сервер (минусы: держать на нем вебсервер и непонятки с лицезиями из-за grace period - либо трейдид лицензии либо думать - зато очень просто)

2 - Вызвать свой клиент- сервер - наподобие того что описан выше .

Просто вместо чтения глобала - нужно создать съимитировать объекты %session, %request и вызвать
Код: plaintext
1.
d ##class(csp.samples.menu).Page()
Всё - возможно потребуется перехватывать вывод страницы - что бы его потом отправить на сторону клиента (ну это если не задаватся целью подстроить HTTP протокол) - пример перехвата есть на сайте у Каратаева в описании плугине для gzip сжатия.
...
Рейтинг: 0 / 0
OPEN,USE,READ,WRITE-"клиент-сервер" через "TCP Binding"
    #34678454
decaml
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PtnЭ-э-э
Ptn, ну это похоже на полный редирект :-), зря я упомянул csp и еср - они есть, для тех функций, для которых их придумали

в принципе если быть точным, в рамках общей идеи csp - это "клиент", а ecp-клиент - это "сервер",
но эта детализация не имеет значения

топик же и был - как сделать этот "клиент-серверный" запрос на cos,
но из обмена мнениями оказалось, что это весьма нетривиально

я бы даже заплатил за работающий пример "стека необходимых классов", чтобы не париться
можем посотрудничать
коллективное решение проблем - это кредо моего проекта
...
Рейтинг: 0 / 0
OPEN,USE,READ,WRITE-"клиент-сервер" через "TCP Binding"
    #34678523
VadimF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
decaml PtnЭ-э-э
Ptn, ну это похоже на полный редирект :-), зря я упомянул csp и еср - они есть, для тех функций, для которых их придумали

в принципе если быть точным, в рамках общей идеи csp - это "клиент", а ecp-клиент - это "сервер",
но эта детализация не имеет значения

топик же и был - как сделать этот "клиент-серверный" запрос на cos,
но из обмена мнениями оказалось, что это весьма нетривиально

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

Что-то очень сложные варианты рассматриваются.
Если производительность не очень критична, стоит использовать Web-сервисы.
В Cache' есть Web-сервисы и SOAP-клиент.
Примеры работы есть в SAMPLES. Дополнительные у консультантов InterSystems.

Можно еще использовать поддержку почтовых протоколов, есть еще классы для работы с HTTP...

Но я советую начать с Web-сервисов.


Вадим
...
Рейтинг: 0 / 0
OPEN,USE,READ,WRITE-"клиент-сервер" через "TCP Binding"
    #34684392
decaml
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PtnОбщая схема такова
Регистред Класс -> внутри параметры соединения и методы
Read
Write
OpenConnection
Close
ServerStart
и т.д.


Уважаемый, Ptn, Вы не могли бы еще показать как реализован метод ServerStart и OpenConnection?
...
Рейтинг: 0 / 0
OPEN,USE,READ,WRITE-"клиент-сервер" через "TCP Binding"
    #34685052
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
/// Клиент-Сервер
Class User.Net Extends %Library.RegisteredObject
{

/// Команда
Property Command As %Library.String;

/// Истина если соединение произведено
Property Connected As %Boolean [ InitialExpression =  0  ];

/// Статус текущей операции
Property Status As %Library.Integer [ InitialExpression =  0  ];

/// Имя системы выполнения
Property Sys As %Library.String [ InitialExpression = {$S(($zv["VMS"):"M/AV",($zv["Windows"):"M/WNT", 1 :"M/UX")} ];

///Таймаут по умолчанию
Property Timeout As %Integer [ InitialExpression = { 10 } ];

Property Type As %Library.String;

/// Строка с описанием устройства используем  9000 -е  порты
Property device As %String [ InitialExpression = {"|TCP|9"_$R( 999 )} ];

/// адрес хоста (IP)
Property host As %Library.String;

/// Порт
Property port As %Library.String;

/// Нулевое устройство что бы сбрасывать ненужную отладку
Property nulldevice As %Library.String [ Calculated, InitialExpression = {"//./nul"} ];


/// в  5 -ке нужно проверять
Method %OnClose() As %Library.Status
{
 d:..Connected ..CloseConnection() q $$$OK
}

/// Инициализим хост и порт  - если указаны сразу соединяемся
Method %OnNew(arg As %Library.String = "") As %Library.Status
{
 n sc,host,port,time s host=$p(arg,":", 1 ),port=$p(arg,":", 2 ),time=$p(arg,":", 3 )
 s ..host=host,..port=port s:time'="" ..Timeout=time
 i (((..host)'="")&(..port'="")) s sc=..OpenConnection(..host,..port)
 q $$$OK
}

/// asc=1 все ок
/// asc=0 таймаут
/// asc=-1 обрыв связи
Method %read() As %Library.String [ Private ]
{
 i '..Connected s ..Status=- 1  q ""
 n ozt,oio,y,l,len s ozt=$ZT,$ZT="%readErr",oio=$IO
 u ..device r y# 2 :..Timeout e  s ..Status= 0 ,$ZT=ozt u oio  q ""
 s len=+($A(y, 1 )* 256 )+$A(y, 2 ) s y=len# 31990  ; проверка на длину строки и заодно переполнение буфера
 r l#(y):..Timeout e  s ..Status= 0 ,$ZT=ozt u oio  q ""
 s ..Status= 1  u oio q l
%readErr s ..Status=- 1 ,$ZT=ozt,..Connected= 0  u oio  q ""
}

Method %write(astr As %Library.String = "") As %Library.Status [ Private ]
{
 i '..Connected s ..Status=-1 q ..Status
 n ozt,oio,l s ozt=$ZT,$ZT="%writeErr",oio=$IO,l=($l(astr)#31990) ; проверка на длину строки и заодно переполнение буфера
 u ..device w $C(l\256,l#256),$e(astr,0,l) w ! s $ZT=ozt u oio s ..Status=1 q ..Status
%writeErr s $ZT=ozt,..Connected=0 u oio s ..Status=-1 q ..Status
}

ClassMethod ChildLoop(sjob As %Library.Integer = 0, aslog As %Library.String = "") As %Library.Status [ Private ]
{
 n %nul,%x,%oldzt,%connection,%type,%sc,%machname,%ipaddr,%userid,%exename,%userdate
 s %oldzt=$ZT,$ZT="childErr",sjob=$g(sjob,"1")
 /// Создаем %connection для JOB и заполняем его
 s %connection=..%New(),%nul=%connection.nulldevice
 s %connection.Connected=1,%connection.device=$IO o %nul u %nul
 i aslog="" s aslog=%nul
 s $ZE=""
 s ^CacheTempserverlog($i(^CacheTempserverlog))=$j_" Server JOB Started"
 /// Читаем первую команду 
 s %x=%connection.TRead() i %connection.Status<0  g childErr

 // Чего нибудь делаем


 s ^CacheTempserverlog($i(^CacheTempserverlog))=$j_" Server JOB Complete" 
childErr s ^CacheTempserverlog($i(^CacheTempserverlog))=$j_" HALT "_$ZE 
 s $ZT=%oldzt 
closechild d %connection.%Close() d $system.OBJ.CloseObjects() 
 q  
}

Method CloseConnection() As %Library.Status
{
 n ozt s ozt=$ZT,$ZT="CloseConnectionErr" i ..Connected c ..device 
 s ..Connected=0,$ZT=ozt 
 q 1
CloseConnectionErr s ..Connected=0,$ZT=ozt q -1
}

/// Вернет IO
Method OpenConnection(host As %Library.String = {"127.0.0.1"}, serverport As %Library.String = {9001}) As %Library.Integer
{
 i ..Connected s ..Status=1 q ..Status
 n ozt s ozt=$ZT,$ZT="OpenConnectionErr",..host=host,..port=serverport 
 o ..device:(..host:..port:"S"):..Timeout e  s ..Connected=0,$ZT=ozt,..Status=0 q ..Status
 s ..Connected=1,$ZT=ozt,..Status=1 q ..Status
OpenConnectionErr s ..Connected=0,$ZT=ozt,..Status=-1 q ..Status
}

ClassMethod ServerLoop(Log As %Library.String = 0) As %Library.Status [ Private ]
{
 n ttt,log,serverport,io,sc,x,len,y s x="",y="",sc=0,log=0
 s log="srv.log" o log:"WAS":5 e  s log=$IO
 i log'=$IO c log
 
 s io="|TCP|9"_$R( 999 )
 
 s serverport= 9001 
 
 #; ip не указывается - слушать на всех адресах  
 o io:("":serverport:"SA"): 10  e  u log w "[",$ZDT($H),"] ["_$j($j, 4 )_"] 0.0.0.0 :",serverport," Cannot open server [",$ZUTIL( 67 , 6 ,$Job),"]",! u  0  c log q $$$ERROR(- 1 ,"["_$ZDT($H)_"] Cannot open server 0.0.0.0 :"_serverport)
 
 o log:"WAS" i $t u log w "[",$ZDT($H),"] ["_$j($j, 4 )_":"_$j($j, 4 )_"] "_$j("0.0.0.0", 15 )_":"_$j(serverport, 5 )_" Server started [",$ZUTIL( 67 , 6 ,$Job),"]",! u  0  c log
 
 s $ZT="serverErr" k ^CacheTemp("ServerControlCenter",$j) s ^CacheTemp("ServerControlCenter",$j)= 1  
 
loop u io r x ;Read for accept 
 j childstart($j,log):(: 5 :io:io) ;  Concurrent server bit is on
 /// Постой машинист не стучите колеса
 s ttt=$g(^CacheTemp("ServerControlCenter",$j),- 1 )
 i ttt= 0  o log:"WAS" i $t u log w "[",$ZDT($H),"] ["_$j($j, 4 )_":"_$j($j, 4 )_"] "_$j("0.0.0.0", 15 )_":"_$j(serverport, 5 )_" Recive STOP signal",! u  0  c log g serverErr
 e  g loop
 
serverErr
 u  0  c io 
 o log:"WAS" i $t u log w "[",$ZDT($H),"] ["_$j($j, 4 )_":"_$j($j, 4 )_"] "_$j("0.0.0.0", 15 )_":"_$j(serverport, 5 )_" Server Shutdown $ZE=",$ZE,! u  0  c log
 q $$$OK
 #; дочерний процесс
childstart(serverjob,slog)
 d ..ChildLoop(serverjob,slog)
 q
}

/// asc= 1  все ок
/// asc= 0  таймаут
/// asc=- 1  обрыв связи
Method TRead() As %Library.String
{
 n str 
TReadLoop s str=..%read() q:(..Status< 1 ) "" s ..Command=$lg(str, 1 ) 
 i ..Command= 1  s $li(str, 1 )= 2  d ..%write(str) g TReadLoop ; пинг спросили отошлем дальше и будес слушать все остальное
 i ..Command= 2  q $li(str, 2 , 5 )    ; пинг вернулся - отдали данные без  1 -го элемента - комманды
 i ..Command= 3  q $lg(str, 5 )      ; данные пришли
 q ""
}

Method TWrite(astr As %Library.String = "") As %Library.Status
{
 d ..%write($lb( 3 ,"","","",astr)) i ..Status= 1  s ..Command= 3 
 q ..Status
}

Method nulldeviceGet() As %Library.String [ CodeMode = expression ]
{
$S((..Sys["M/AV"):"NL:",(..Sys["M/WNT"):"//./nul", 1 :"/dev/null/")
}

}
...
Рейтинг: 0 / 0
OPEN,USE,READ,WRITE-"клиент-сервер" через "TCP Binding"
    #34686479
decaml
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ptn, спасибо, чувствую как глаза налились радостью.
...
Рейтинг: 0 / 0
OPEN,USE,READ,WRITE-"клиент-сервер" через "TCP Binding"
    #34690616
decaml
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
однако заработало

клиент

set con=##class(User.Net).%New()
if con.OpenConnection("127.0.0.1","9001") {
d con.TWrite($lb("GSA:READ","^Pluk"))
for {
set ret=con.TRead() quit:con.Status'=1
//w ret
set comand=$lg(ret,1) quit:comand'="GSA:READOK"
w "Узел :",$lg(ret,2)
w " = ",$lg(ret,3),!
}

}
set con=""
q

сервер

do ##class(User.Net).ServerLoop()

класс

...
/// Читаем первую команду
s %x=%connection.TRead() i %connection.Status<0 g childErr
// Чего нибудь делаем
//-------------------------------
if $lg(%x,1)="GSA:READ" {
d %connection.GSAREAD($lg(%x,2))
}elseif 0=1 {
// ...
}
//-------------------------------
s ^CacheTempserverlog($i(^CacheTempserverlog))=$j_" Server JOB Complete"
...
Method GSAREAD(glb As %Library.String="") As %Integer
{
new var,ret
set $ZT="GSAREADerr"
set var=$g(glb)
d %connection.TWrite($lb("GSA:READOK",var,$g(@var)))
for { set var=$q(@var) quit:var=""
d %connection.TWrite($lb("GSA:READOK",var,$g(@var)))
}
set $ZT=""
q
GSAREADerr
set $ZT=""
q
}
...
...
Рейтинг: 0 / 0
OPEN,USE,READ,WRITE-"клиент-сервер" через "TCP Binding"
    #34690810
decaml
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если на клиенте сделать в цикле 400 "считываний" ^Pluk, и повторять запуск серий,

то на вызове con.TWrite порой проскакивает con.Status=-1 (ошибка) -
в 70 из 400 случаев в 1-ой серии (т.е. 330 успешных соединений),
в 180 из 400 во 2-й серии,
в 250 из 400 в 3-й серии
в 310 из 400 в 4-й серии
в 330 из 400 в 5-й серии
в 360 из 400 в 6-й серии

потом "сокет-сервер" как накушался чего-то и не принимает клиентские вызовы

место ошибки - метод %write начинает уходить в $ZT на этой строчке
u ..device w $C(l\256,l#256),$e(astr,0,l) w ! s $ZT=ozt u oio s ..Status=1 q ..Status

рестарт "сокет-сервера" не помогает
а после рестарта каше "сокет-сервер" оживает

интересно какая бы могла быть причина таких ошибок?
(WindowsXp + cache5.0.11)
...
Рейтинг: 0 / 0
OPEN,USE,READ,WRITE-"клиент-сервер" через "TCP Binding"
    #34690832
decaml
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ой, количество ошибок резко уменьшилось

если вместо
Код: plaintext
1.
2.
3.
Property device As %String [ InitialExpression = {"|TCP|9"_$R( 999 )} ];
...
 s io="|TCP|9"_$R( 999 )

написать
Код: plaintext
1.
2.
3.
Property device As %String [ InitialExpression = {"|TCP|9"_$R( 9999 )} ];
...
s io="|TCP|9"_$R( 9999 )

ошибок коннектов меньше в разы
5 из 400
20/400
40/400
57/400
136/400

Интересно можно освобождать номера устройств?
...
Рейтинг: 0 / 0
OPEN,USE,READ,WRITE-"клиент-сервер" через "TCP Binding"
    #34691145
decaml
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
уф, разобрался :-)
на клиенте добавил освобождение устройства и нет никаких ошибок
Код: plaintext
1.
c con.device

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Method CloseConnection() As %Library.Status
{
 //n ozt s ozt=$ZT,$ZT="CloseConnectionErr" i ..Connected c ..device 
 n ozt s ozt=$ZT,$ZT="CloseConnectionErr" c ..device 
 s ..Connected= 0 ,$ZT=ozt 
 q  1 
CloseConnectionErr s ..Connected= 0 ,$ZT=ozt q - 1 
}
...
Рейтинг: 0 / 0
OPEN,USE,READ,WRITE-"клиент-сервер" через "TCP Binding"
    #34691166
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну хуже не станет :)
...
Рейтинг: 0 / 0
OPEN,USE,READ,WRITE-"клиент-сервер" через "TCP Binding"
    #34691170
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код отключения в %OnClose - код этот 4-шный... в 5-ке может приводить к проблемам - оссобенно если еще и объект за собой не нулить
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / OPEN,USE,READ,WRITE-"клиент-сервер" через "TCP Binding"
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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