– 2个新公告
– 1个新问题
✓ 十一月有 32 位新成员加入
✓ 所有时间发布了 2,284 篇帖子
✓ 所有时间有 2,071 位成员加入
✓ 十一月有 32 位新成员加入
✓ 所有时间发布了 2,284 篇帖子
✓ 所有时间有 2,071 位成员加入
$ZB 显示结束读取的内容$ZB显示当前设备上最后一次READ操作结束的字符序列或事件。不能设置$ZB ;每次执行READ时,IRIS 都会设置$ZB的值。可以使用此值来作用于不可打印的字符,例如向上箭头键或功能键。
$ZB可以包含以下任意内容:
READ x#y的字符数yREAD *x的单个字符$ZB永远不会包含超过 64 个字符。较长的转义序列无效。
$ZB 示例以下示例将用户指定的输入字符分配给READ命令变量x ,并将输入终止符(通常是 Return 字符)分配给$ZB特殊变量。从终端提示符发出此命令时,您需要设置一个变量以在与READ命令相同的命令行上捕获$ZB的值。这是因为用于发出命令行的行返回被写入$ZB作为终止符。此示例使用ZZDUMP显示$ZB捕获的字符的值。
USER>READ x SET y=$ZB
USER>ZZDUMP y
0000: 0D
USER>
OPEN 命令建立终端的所有权。可选参数列表可以设置右边距、指定设备协议以及指定一个或多个终止字符。在参数列表之后,可以选择指定超时参数和/或mnespace参数。
$X 的转义序列更新要选择非默认行为来更新进程的$X ,请发出%SYSTEM.Process类的 DX( n ) 方法。
系统管理员可以通过类中设置 Config.Miscellaneous 的DX属性来更改系统范围的默认行为。
在这两种情况下, n 的值都在 0 到 4 之间,如下所示:
| Value | Default Behavior for Updating $X |
|---|---|
| 0 | Default for InterSystems IRIS |
| 1 | DSM behavior |
| 2 | DTM/MSM behavior |
$TEST特殊变量由采用超时值的命令设置。这些命令包括OPEN和READ 。 $TEST的值可以设置为 1 或 0:
$TEST设置为 1。$TEST将设置为 0。注:没有超时的OPEN和READ命令对$TEST没有影响。
$ZA 显示读取状态$ZA特殊变量包含许多位标志,显示当前设备上最后一次READ的状态。不能设置$ZA ; IRIS 控制其价值。 $ZA在下一次READ之前保持有效。 $ZA包含表中列出的值的总和,这显示了程序如何测试此变量。 ( $ZA还包含调制解调器连接状态的位标志,此处未列出。
WRITE *不会更改$X和$Y 。因此,可以将控制序列发送到终端, $X和$Y仍将反映真实的光标位置。某些控制序列确实会移动光标,因此可以在需要时直接设置$X或$Y 。
$X 和 $Y 示例在以下示例中,控制序列将 VT100 终端中的光标移动到第 10 行、第 20 列,并相应地设置$X和$Y 。
; set DY and DX to desired
; values for $Y and $X
SET DY=10
SET DX=20
; ...
; escape sequence moves
; cursor to desired position
WRITE *27, *91, DY+1, *59, DX+1, *72
; ...
; updates $X and $Y
SET $Y=DY
SET $X=DX
$X 和 $Y的影响各不相同转义序列可以改变$X和$Y值上的回显效果。三个因素控制着这种影响:
OPEN或USE命令中指定了 /NOXY(禁用$X和$Y处理)。%SYSTEM.Process类的 DX() 方法来设置$X如何处理当前进程的转义序列。可以通过类中设置 ConObjectScript 提供支持串行异步 ASCII 终端的命令。还可以将这些命令与控制台 I/O 结合使用。
使用终端 I/O,例程可以:
ANSI 标准转义序列。Ctrl-C中断的识别。XON ( Ctrl-Q ) 和 XOFF ( Ctrl-S ) 控制传入和传出数据流。COM 端口状态参数和调制解调器波特率。在大多数平台上,打印机被视为终端 I/O 设备。 UNIX® 系统始终将打印机作为终端 I/O 设备来处理。在 Windows 上,通过串行通信端口连接的打印机被视为终端 I/O 设备。否则,Windows 系统将打印机作为顺序文件 I/O 设备处理。
登录 IRIS 的终端或控制台是主要设备。无需打开主要设备。如果尚未发出OPEN和USE ,则进程第一次发出READ或WRITE时,系统会自动打开主设备,并将其设置为当前设备,就像您已显式发出OPEN 0 USE 0一样。
在本页的其余部分中, “终端”一词用于指代终端和控制台。
I/O 条件I/O 命令可以影响特殊变量的值。
UDP 支持 IPv4 和 IPv6 互联网协议。由于这些协议不兼容,服务器和客户端都必须使用相同的Internet协议,否则传输将失败。
IPv4 地址具有以下格式。 n是 0 到 255 范围内的十进制整数:
n.n.n.n
可以将 IPv4 协议指定为"0.0.0.0" 。
IPv6 地址具有以下完整格式。 h是一个具有四个十六进制数字的十六进制数:
h:h:h:h:h:h:h:h
通常,IPv6 地址的缩写方式是消除前导零并用双冒号 (::) 替换连续的零部分; IPv6 地址中只能使用一个双冒号。通过使用 IPv4 缩写规则,可以将 IPv6 协议指定为“::” (意味着所有 8 个h部分的值为 0000)。
建立互联网协议:
%New() 方法中建立 IPv4 或 IPv6。默认为 IPv4。GetHostAddr()方法中指定并在Send()方法中提供(以二进制形式)的 IPv4 或 IPv6 协议匹配。以下是 IPv4 传输:
Server
SET sobj=##class(%Net.UDP).%New(3001,"127.0.0.1")
SET inmsg=sobj.Recv()
Client
SET cobj=##class(%Net.UDP).本页介绍如何使用 UDP 在进程之间建立远程通信。
通过%Net.UDP来支持 UDP。此类提供以下方法: Send()数据包到指定的目的地和端口、 Recv()来自套接字的数据包以及Reply()发送器最后收到的数据包。
目标被标识为本地主机名或者 IPv4 或 IPv6 主机地址。该端口可以是指定的端口号或动态端口分配。
UDP套接字要使用 UDP,必须使用%New()方法来创建 UDP 套接字对象。然后,该对象实例用于发送、接收和回复数据包传输。
创建 UDP 套接字对象时,可以指定端口号和主机地址,如下例所示:
SET UPDOref=##class(%Net.UDP).%New(3001,"0.0.0.0")
端口号和主机地址都是可选的。 %New()方法返回 UDP 套接字对象实例的 OREF(对象引用)。
UDP 对象时,它必须定义接收请求的端口号。UDP 对象时,它可以使用动态端口号。默认值为0。当它发送数据包时,必须指定提供者的主机名和端口号。Send()方法指定目标的二进制地址。这是主机地址的二进制版本。
本页讨论使用 TCP/IP 在 IRIS 数据平台进程之间进行通信的几个高级主题。
服务器一次仅维护一个连接。如果在另一个连接打开时第二个客户端尝试连接,TCP/IP 会将该客户端放入队列中。在队列中时,第二个客户端可以向端口写入数据,就像已连接一样。第二个客户端写入的数据保留在缓冲区中,直到第一个连接关闭并且第二个客户端连接为止。
如果第二个客户端在连接存在之前发出READ,则会挂起。当第二个客户端在队列中时,第三个客户端的任何连接尝试都会失败。
如果已经打开 TCP 设备的客户端在第一个连接仍然存在时尝试第二次连接,则第二个OPEN命令会导致错误。将这种情况视为错误而不是USE命令可以防止出现意外的结果。如果错误的程序认为它已打开新连接,而实际上它正在重用可能具有不同目标或不同参数的现有连接,则可能会出现此类意外结果。
TCP 设备的作业命令可以使用JOB命令来实现TCP并发服务器。 TCP 并发服务器允许同时为多个客户端提供服务。在这种模式下,客户端不必等待服务器完成为其他客户端提供服务。相反,每次客户端请求服务器时,它都会为该客户端生成一个单独的子作业,只要客户端需要它,该子作业就会保持打开状态。一旦生成该子作业(由JOB命令的返回指示),另一个客户端就可以请求服务,并且服务器也将为该客户端创建一个子作业。
非并发和并发模式下的客户端/服务器连接。
如果正在编写一个IRIS服务器来与无法控制的客户端连接,则服务器进程必须发出CLOSE命令来关闭TCP连接。就 IRIS而言,CLOSE命令确实会关闭连接,但是在内部TCP/IP会在服务器上为这个连接保留最长两分钟的资源。
当jobserver用于为TCP/IP作业提供服务时,可能会产生意想不到的结果。当一个JOBSERVER进程执行暂停时,该进程立即返回到可用的JOBSERVER进程池,但其资源在内部保留最多两分钟。由于JOBSERVER进程是在第一个可用的基础上分配的,因此来自数量相对较少的客户机的重载可能会耗尽JOBSERVER进程的资源。
为了避免这个问题,在JOBSERVER下运行的JOB打开的TCP/IP服务器应该显式地发出一个CLOSE命令,然后在最后的QUIT或HALT)命令之前发出一个简短的HANG命令。根据TCP/IP规范,需要一个HANG 120来保证在JOBSERVER的转世之间没有资源仍在使用。在实践中,一秒的HANG通常足以在JOBSERVER进程之间均匀地分配资源负载。
在某些情况下,TCP会将不同的记录连接在一起形成单个记录。如果客户端或服务器进程向一个由WRITE分隔的TCP端口发出一系列WRITE命令,则可能会发生串接!或用于刷新缓冲区的WRITE#命令,而不管读命令是否在连接的另一端等待。
Process A Process B
%SYS> USE "|TCP|41880" R A U 0 W A %SYS> USE "|TCP|41880" WRITE "ONE",!,"TWO"
<RETURN> <RETURN>
ONE
%SYS> USE 41880 R A U 0 W A
<RETURN>
TWO
第二个例子概述了在进程B完成将两条记录写入到TCP端口之后,当它发出读命令时,进程A如何接收一条串联的记录。
Process A Process B
. %SYS> USE "|TCP|41880" WRITE "ONE",!,"TWO"
..png)
当我们将 InterSystems IRIS 安装在Windows 系列操作系统中时,往往同时使用IIS 作为其Web 服务器。
但这时候我们却发现,由RESTful返回的错误信息却不能正常显示出来了,特别是在调试程序的时候,非常不方便。
比如在测试 FHIR Post/Put 请求时,我们的请求消息体中包含不正确的内容,这时我可以看到返回的是HTTP 400 Bad Request的返回内容.
我无法具体知道请求消息体哪句出错了,这对我调试程序造成很大困扰。
解决方法:
1. 打开IIS的管理页面,双击 错误页
.png)
2. 选择右侧 编辑功能设置
.png)
3. 选择错误响应下的 详细错误 选项。
.png)
我们再次请求,此时可以看到页面上显示了详细的错误信息
.png)
相关详细信息可以查看文档:Configuring IIS to Return SOAP Fault Details 以及 HTTP Errors
以下示例显示了一个非常简单的并发服务器,只要它检测到来自客户端的连接,就会产生一个子作业。 JOB指定一个并发服务器位开关值(值16)并通过符号表(值1):16+1=17。
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:(:17: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.服务器一次只维护一个连接。如果第二个客户端在另一个连接打开时尝试连接,则 TCP/IP 将该客户端放入队列中。在队列中时,第二个客户端可以像已连接一样写入端口。第二个客户端写入的数据保留在缓冲区中,直到第一个连接关闭并且第二个客户端连接。
如果第二个客户端在连接存在之前发出 READ,它就会挂起。当第二个客户端在队列中时,第三个客户端的任何连接尝试都会失败。
如果已经打开 TCP 设备的客户端在第一个连接仍然存在时尝试第二次连接,则第二个 OPEN 命令会导致<COMMAND> 错误。将这种情况视为错误而不是 USE 命令可以防止出现意外结果。如果一个错误的程序认为它打开了一个新连接,而实际上它正在重用一个可能具有不同目标或不同参数的现有连接,则可能会出现这种意想不到的结果。
可以使用 JOB 命令来实现 TCP 并发服务器。 TCP 并发服务器允许同时为多个客户端提供服务。在这种模式下,客户端不必等待服务器完成对其他客户端的服务。相反,每次客户端请求服务器时,它都会为该客户端生成一个单独的子作业,只要客户端需要它,该子作业就会保持打开状态。一旦生成此子作业(由 JOB 命令的返回指示),另一个客户端可能会请求服务,服务器也会为该客户端创建一个子作业。
$ZB 和 READ 命令$ZB 保存终止读取的字符。该字符可以是以下之一:
READ x#y 的第 y 个字符READ *X 的单个字符CR LF 结尾,则只有 CR 会放在 $ZB 中。TCP 设备的 WRITE 命令在使用 OPEN 和 USE 建立连接后,WRITE 命令将数据从客户端或服务器发送到 TCP 设备。
语法如下:
WRITE x
WRITE !
WRITE #
WRITE如何工作WRITE x 在建立连接后将 x 从客户端或服务器发送到缓冲区。
WRITE !和 WRITE # 不表示换行和换页。相反,它们告诉 IRIS 刷新缓冲区中保留的所有字符,并通过网络将它们发送到目标系统。
可以使用 %SYSTEM.INetInfo类的 TCPStats() 方法确定当前 TCP 连接执行的写入次数。
WRITE 修改 $X 和 $YIRIS 将缓冲区中的字符数存储在 $X 特殊变量中。
ASCII 字符 <return> 和<line feed> 不包括在此计数中,因为它们不被视为记录的一部分。用 WRITE 刷新缓冲区!将 $X 重置为 0,并将 $Y 的值增加 1。
READ 命令从服务器或客户端发出 READ 命令以读取客户端或服务器设置的任何字符。
语法如下:
READ var:timeout
READ *var:timeout
READ var#length:timeout
超时参数虽然是可选的,但强烈建议使用,因为如果指定了超时,则 READ 的成功或失败由 $TEST 特殊变量的值指示。如果在超时到期之前读取尝试成功,则 $TEST 设置为 1;如果超时到期,$TEST 设置为 0。
超时参数支持秒和秒的分数到 1/100 秒。例如,10、10.5、.5、.05。
对于 SSL 连接,如果连接建立后另一方从未发出读或写命令,则作业可以等待第一个读或第一个写命令。在这种情况下, IRIS 支持 READ 命令的读取超时和 WRITE 命令的写入超时(使用 /WRITETIMEOUT=n 选项)。如果没有指定读或写超时,则作业将等待,直到对方发出读或写命令。
可以使用 %SYSTEM.INetInfo类的 TCPStats() 方法确定当前 TCP 连接执行的读取次数。
READ 修改 $ZA 和 $ZB应用程序可以通过测试 $ZA 和 $ZB 的值来了解连接和读取是如何成功的。
$ZA 和 READ 命令$ZA 报告连接状态。
TCP 设备可以使用 %SYSTEM.TCPDevice方法返回当前 TCP 设备的 IP 地址和端口号。可以使用 Help() 方法列出这些方法,如下所示:
DO $SYSTEM.TCPDevice.Help()
可以通过在 Help() 中指定方法名称来显示有关特定方法的信息,如以下示例所示:
DO $SYSTEM.TCPDevice.Help("LocalAddr")
IMP>DO $SYSTEM.TCPDevice.Help("LocalAddr")
method:class的描述 LocalAddr:%SYSTEM.TCPDevice
LocalAddr(Format:%Integer=0)
Get local IP address of current TCP device.<br>
<br>
<b>Parameters:</b> <br>
<b>Format</b> - The format of address to be returned. If this argument is omitted the default value is 0.TCP设备的OPEN和USE命令关键字可以使用位置参数(如上所述)或关键字参数。下表描述了使用OPEN和USE命令控制TCP设备的关键字。还有其他只能在OPEN命令中指定的OPEN-only关键字(本章稍后将描述)。所有关键字参数都是可选的。
TCP设备的OPEN和USE命令关键字| Keyword | Default | Description |
|---|---|---|
/ABSTIMEOUT[=1] |
0 | 指定读超时行为。确定TCP在接收到数据时是否应重新初始化超时时间。如果/ABSTIMEOUT=0(默认值),则每次接收数据时timeout都会重置为原始值。如果/ABSTIMEOUT或/ABSTIMEOUT=1,则在接收数据时超时时间继续倒数。 |
/ACCEPT[=n] or /ACC[=n] |
0 | 对应于“A”模式参数字符,该参数指定一旦接受来自客户端作业的连接,服务器上的初始读取就以零长度字符串终止。/ACCEPT和/ACCEPT=n对于n的非零值启用A模式。/ACCEPT=n表示零值n禁用a模式。 |
/CLOSEFLUSH[=n] |
1 |
指定当设备关闭时,对保留在输出缓冲区中的数据的处理。/CLOSEFLUSH和/CLOSEFLUSH=n对于n的非零值将刷新剩余数据。 |
客户端OPEN命令与服务器端OPEN命令只有一个方面的不同:第一个设备参数必须指定要连接的主机。要指定主机,需要包括客户端识别为主机的名称或Internet地址。
一旦建立连接,OPEN开就会成功。此时,可以读取或写入该TCP设备。但是,如果连接的服务器端是另一个 IRIS进程,则在使用WRITE命令将一些数据从客户端发送到服务器之前,服务器不会完成其连接端。因此,必须在发出任何读取命令之前发出写入命令。
客户端 OPEN 命令的一些示例是:
OPEN "|TCP|4":("hal":4200::$CHAR(3,4)):10
此命令在端口 4200 上打开到主机 hal 的连接。它没有指定模式字符串。它指定了两个终止符(ASCII $CHAR(3) 和 $CHAR(4)),以及默认的输入和输出缓冲区大小。它指定 10 秒的超时。
以下命令与上一个命令相同,只是目标是 IPv4 格式的显式 IP 地址。
OPEN "|TCP|4":("129.200.3.4":4200::$CHAR(3,4)):10
可以使用 OPEN 关键字 /USEIPV6 来指定要使用的协议。
下面的命令连接到远程主机“larry”上的时间服务器,并在主输入设备上以ASCII格式打印远程主机的时间。
Q 模式)在立即发送模式下,每个 WRITE 命令都作为其自己的数据包输出。如果不使用立即发送模式,则必须包括终止符或发出命令 WRITE *–3 以输出数据包。
通过指定“Q”模式字符或/SENDIMMEDIATE(或/SEN)关键字参数进入此模式。要关闭此选项,请指定以下任一选项:
USE TCPDEVICE:(/SEN=0)
USE TCPDEVICE:(::"-Q")
要重新打开此选项,请指定以下任一选项:
USE TCPDEVICE:(/SEN=1)
USE TCPDEVICE:(::"+Q")
立即发送模式与/NODELAY模式结合使用,前者在每次写入时创建一个包,后者在创建每个包时立即发送。当这两个选项都启用时,单个数据突发的传输速度将最大化。当每个数据单元的及时传送至关重要时,例如在传输鼠标移动时,这是有用的。当两者都关闭时,一个数据包可能包含多个写入,一个传输可能包含多个数据包。这减少了网络流量并提高了整体性能。立即发送模式的默认设置为关闭。/NODELAY模式的默认设置为打开。
S模式)在流模式下, IRIS不会保留数据流中的TCP消息边界。发送时,如果数据不适合消息缓冲区, IRIS会在将数据放入缓冲区之前刷新缓冲区。
接收时,可以接收最大字符串长度的数据。
如果未指定模式,则默认为数据包模式。如果流模式被禁用,则该模式默认为分组模式。
在分组模式中,只要有一些数据要返回,读取命令就会完成。数据包模式允许在输出缓冲区中构建整个TCP数据段,然后通过发出WRITE*-3或WRITE!命令。
如果在没有要发送的字符的情况下发出WRITE*-1来启动一个TCP发送操作,则会收到一个<WRITE>错误。如果发出WRITE OF空字符串,则会收到<COMMAND>错误。
在分组模式下可以发送的字符串的最大长度为1024个字符。如果在未刷新缓冲区的情况下超过此限制,则会收到<WRITE>错误。
因为 TCP/IP 忽略长度为 0 的记录,所以如果在其中没有字符时刷新写入缓冲区,会收到 <WRITE>错误。
在服务器收到连接请求之前,从服务器到客户端的WRITE命令会在服务器上产生<WRITE> 错误。
C模式)此模式修改对输入和输出的回车处理。
在输出时,WRITE ! 生成“CR LF”,而WRITE#生成“CR FF”。
在输入时,在启用T模式的情况下,服务器尝试将相邻的CR和LF或相邻的CR和FF记录为$ZB中的单个终止符。如果CR和LF没有在彼此的短时间间隔内到达,则将它们作为单独的终结器进行处理。默认情况下,间隔为1秒。
D模式)此模式打开或关闭异步断开监控。
Supported 参数parameters 参数可以是以下格式之一:
hostname
(hostname{:port{:mode{:terminators{:ibufsiz{:obufsiz{:queuesize{:keepalivetime}}}}}}})
parameters 参数中的参数如下:
hostname - 可选 — IP 主机的名称、IPv4 协议格式的 IP 地址或 IPv6 协议格式的 IP 地址。指定为带引号的字符串。客户端 OPEN 需要主机名;对于服务器端 OPEN,省略(由占位符冒号表示)。
port - 可选 — 如果存在,这是用于连接的 TCP 端口号。如果此端口号为空或省略,则端口号从设备名称的数字部分派生。该参数可以是十进制的端口号,也可以是服务名,提交给本地系统的TCP服务名解析器。
mode - 可选——用引号括起来的字母代码字符的字符串。字母代码可以按任何顺序指定;由于 IRIS按从左到右的顺序执行字母代码,因此字母代码之间的交互在某些情况下可能决定首选顺序。默认为数据包模式。模式字符串可以由以下一个或多个字母代码组成:
A-接受模式。如果A处于打开状态,则在接受来自客户端作业的连接后,服务器上的初始读取将立即以零长度字符串终止。OPEN命令OPEN命令保留一个TCP绑定设备供使用。其语法为:
OPEN devicename:parameters:timeout:mnespace
devicename - 一个|TCP|格式的字符串,后面跟着一些数字数字。设备名称的数字部分称为设备标识符。如果OPEN参数中没有指定端口号,则该设备标识符必须是唯一的5位TCP端口号。如果在OPEN参数中指定了端口号(这是首选的实践),这个设备标识符可以是任何唯一的数字(最多2147483647),只要单个作业使用的所有TCP设备名称是不同的。
parameters - 可选-一系列一个或多个设备参数,用括号括起来,用冒号(:)分隔。如果省略了某个参数,请为缺少的参数指定冒号分隔符。(对于服务器端OPEN,始终省略第一个参数。)。具体参数说明如下。
如果只指定第一个参数(hostname),可以省略括号。例如客户端open: open "|TCP|7000":"127.0.0.1":10。如果不指定参数,则可以省略圆括号,但必须保留冒号作为分隔符。例如:服务器端open: open "|TCP|7000"::10。
timeout - 可选- IRIS尝试打开TCP设备的最大秒数。如果在此间隔内没有成功,它会将$TEST设置为0,并将控制权返回给进程。
TCP 客户端/服务器通信本章介绍如何使用 TCP/IP 在 IRIS 数据平台进程之间设置远程通信。
IRIS 支持两种互联网协议 (IP):TCP 和 UDP。这些 Internet 协议允许 IRIS 进程与本地或远程系统上的进程通信,无论这些进程是否正在运行 IRIS。
TCP IRIS 传输控制协议 (TCP) 绑定。在服务器和单个客户端之间建立双向连接。提供具有错误检查和纠正以及消息确认的可靠字节流数据传输。UDP IRIS 用户数据报协议 (UDP) 绑定。提供服务器和大量客户端之间的双向消息传输。 UDP 不是基于连接的;每次传输数据包都是一个独立的事件。为本地数据包广播和远程多播提供快速和轻量级的数据传输。本质上不如 TCP 可靠。不提供消息确认。TCP 绑定将 IRIS 连接到广泛的网络标准,这样 IRIS 用户就可以通过 I/O 命令使用底层网络协议的基本功能。
TCP/IP 协议允许系统进行通信,即使它们使用不同类型的网络硬件。例如,TCP 通过 Internet 连接在使用以太网的系统和使用令牌环的另一个系统之间传输消息。 TCP 控制数据传输的准确性。 IP 或 Internet 协议在网络或 Internet 上的不同系统之间执行实际数据传输。
使用 TCP 绑定,可以创建客户端-服务器系统的客户端和服务器部分。
本页介绍如何在两个或多个 IRIS 数据平台进程之间建立通信。
作业间通信 (IJC) 设备是一组特殊设备编号,可让在两个或多个 IRIS 进程之间传输信息。这些流程可以是作业流程或交互式流程。
IJC 设备成对工作。最多可以有 256 个 IJC 设备对。使用称为接收器的偶数设备来读取数据。使用称为发送器的奇数设备来写入数据。尝试从发送器读取或写入接收器会导致 <NODEV> 错误。
可以向 IJC 设备发出 I/O 命令,就像向任何其他设备一样。向设备发出OPEN和USE命令后,进程可以发出:
一次只能有一个进程可以打开设备。
对基于 IRIS 设备表中映射的相对顺序,可以使用管理门户的配置选项查看和编辑该表。
每对设备都与一个 IJC 内存缓冲区关联。当进程向任何奇数 IJC 设备发出WRITE命令时 IRIS 会将数据写入该设备对的缓冲区中。当另一个进程向该对中的偶数设备发出READ命令时 IRIS 会从同一缓冲区读取数据。
写入的数据以先进先出的方式缓冲在内存中。如果在设备为空时发生READ ,则发出该信号的进程将挂起,直到另一个进程发出相应的WRITE 信号。缓冲区已满时发生的写入将挂起,直到另一个进程从该缓冲区读取数据。
将消息写入缓冲区后,即使关闭发送器,它也会保留在那里直到被读取。
CLOSE 命令如果使用带Q (/QUEUE) 参数代码的OPEN创建子进程,则该子进程可能会在设备上的CLOSE操作中继续存在。排队的进程间通信管道的生存能力取决于平台。在 UNIX® 系统上,子进程始终在CLOSE后继续存在。在 Windows 系统上,进程的生存取决于进程的年龄。刚刚启动的子进程不会在CLOSE操作中幸存,但是一旦子进程完全建立,它就会在 CLOSE操作中幸存。
在 UNIX® 系统上,可以指定关闭管道命令设备时CLOSE命令应等待的时间。超时默认值为 30 秒。可以通过指定OPEN命令closetimeout位置参数来修改此默认值。可以通过指定可选的“I”位置参数来覆盖CLOSE命令的默认或指定超时。 “I”参数指定立即关闭(1 秒后关闭)。 CLOSE语法如下:
CLOSE cpipename:"I"
Visual Basic 进行通信在 Windows 上,在 IRIS 中使用命名管道就像使用 TCP 设备一样,但使用设备名称|NPIPE|nnn而不是|TCP|nnn 。 OPEN参数如下:
OPEN "|NPIPE|3":(server:pipename)
其中server是计算机名称, pipename是要连接到的管道的名称。
READ:pc readargument,...
READ 从管道读取数据。
其中reargument可以是:
formatting-mode
string
variable:timeout
*variable:timeout
variable#n:timeout
将 I格式化模式参数与管道一起使用。 I 参数允许对命名管道发出定时READ,而不会丢失跟随在一个部分记录中的任何数据。错误。当在READ上使用此参数时, READ会忽略消息。
默认情况下,I格式化模式的值处于关闭状态。如果在没有超时的情况下在READ命令中包含此参数,则进程将挂起,直到有数据要处理。
CPIPE 退出代码可以检索命令管道 (|CPIPE|) 进程的退出代码。必须在 |CPIPE| 之前检索此退出代码设备已关闭。它是通过%SYSTEM.Process 类的PipeExitCode方法获得的。退出代码始终是整数值。如果退出代码不可用,该方法将返回空字符串并设置状态参数和解释,如以下示例所示:
SET exitcode=$SYSTEM.Process.PipeExitCode(device, .status)
IF exitcode="" {DO $SYSTEM.OPEN 和 USE 命令关键字以下列表描述了用于使用OPEN和USE命令控制进程间通信管道的关键字。
/IOTABLE[=name] 默认值:如果未指定名称,则使用设备的默认 I/O 转换表。
对应K\name\参数代码,为设备建立I/O转换表。
/TRANSLATE[=n]默认值:1
与K参数代码相关。 /TRANSLATE 或 /TRANSLATE= n (对于n的非零值)启用设备的 I/O 转换。 /TRANSLATE= n如果n值为零,则会禁用设备的 I/O 转换。
/XYTABLE[=name]默认值:如果未指定名称,则使用设备的默认 $X/$Y 操作表。
对应Y\name\参数代码,为设备建立$X/$Y动作表。
OPEN 关键字以下列表描述了仅使用OPEN命令控制进程间通信管道的关键字。
/ENV=environmentvars指定要在新进程中设置的环境变量。有两种指定值的方法:
/ENV=(name1:value1,name2:value2)
Set arr(name1)=value1
Set arr(name2)=value2
// then later use the following in the OPEN command:
/ENV=arr.以下是有效的命令管道OPEN语句。
各位社区成员,大家好!
我们很高兴推出一种全新的方式让您展示创造力和技能! 这次,我们邀请您参加我们首次发起的视频挑战:
请在 2024 年 10 月 21 日到 11 月 10 日提交与 InterSystems IRIS 产品或服务相关的任何主题的视频。
🎁 人人有礼 + 主要奖品!
.jpg)
OPEN 命令OPEN命令允许程序与 IRIS 外部的进程进行通信。
OPEN Argumentscpipename 管道名称仅命令管道— “|CPIPE|”或"|CPIPE|xxxxxx" ,其中xxxxxx表示用户指定的唯一标识符。
program 程序命令管道可以使用命令 shell 或不使用命令 shell(直接)执行程序。在大多数情况下,首选不使用命令 shell 执行。标准管道使用命令 shell 执行程序。
仅命令管道— 要在不使用命令 shell 的情况下执行,请指定 /COMMAND= program 。如果程序有参数,则必须使用 /ARGS 关键字指定它们。如果指定 /COMMAND 或 /ARGS 关键字,则无需命令 shell 即可执行程序: (/COMMAND=program) 、 (/COMMAND=program:/ARGS=arg1)和(program:/ARGS=arg1)都是有效的语法。 /ARGS 可以采用单个参数、以逗号分隔的参数列表或数组。例如, (/COMMAND=program:/ARGS=arg1,arg2) 。