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