为支持医疗信息行业人才发展,InterSystems 为中国市场量身定制了贴近需求、灵活、实操性强的技术认证培训计划,由 InterSystems 资深技术专家亲自授课,帮助用户快速掌握 InterSystems 技术,确保用户从快速发展的 InterSystems 技术中获益,以更好地服务于医院信息化建设。点击此处查看课程详情:InterSystems中国技术培训认证
第五十一章 File 输入 输出 - 文件路径名工具
文件路径名工具
如果当前设备是顺序文件,则$ZIO包含该文件的完整路径名。
可以使用$ZSEARCH返回指定文件或目录的完整文件规范(路径名和文件名)。文件名可能包含通配符, $ZSEARCH使用通配符返回一系列满足通配符的完全限定路径名。
%Library.File 类包含许多提供文件系统服务的方法。这些包括:
NormalizeDirectory(),返回指定文件或目录的完整路径名。NormalizeFilenameWithSpaces(),根据主机平台的情况处理路径名中的空格。如果路径名包含空格字符,则路径名处理取决于平台。Windows和 允许路径名中包含空格字符,但包含空格的整个路径名必须用一组附加的双引号 字符括起来。这与 语句一致。有关详细信息,请指定在 命令提示符下。
波形符 (~) 扩展
在 路径名中,波形符 () 表示长名称的 压缩。例如: 。要转换压缩目录名称,请使用 类的 方法。
在 路径名中,可以使用波形符 () 扩展来指示当前用户的主目录或指定用户的主目录:
- 和分别扩展到当前用户的主目录:
/Users/techwriter/和 。 - 扩展到用户“”的主目录: 。但是,如果用户不存在, 会扩展为当前用户的完整目录路径名,并附加作为文字: 。
- 和
第五十章 File 输入 输出
本页介绍在 IRIS 数据平台中使用顺序文件。
重要:在大多数情况下,可以使用 %Library.File 类提供的 API,而不需要此页面上的详细信息。请参阅使用 %Library.File 。
介绍
所有操作系统都将磁盘 文件视为顺序文件。 系统将打印机视为顺序文件 I/O 设备(除非打印机通过串行通信端口连接)。 ® 系统将打印机视为终端 I/O` 设备。有关打印机的更多详细信息,请参阅打印机。
本节讨论 如何处理顺序文件。它提供了顺序文件 的介绍以及相关命令的说明。
- 要访问顺序文件,必须首先使用
OPEN命令打开该文件,并提供文件名作为参数。还可以选择指定OPEN模式参数。如果N指定的文件不存在,则模式参数指定是否创建新文件。您可以同时打开多个文件。 - 打开顺序文件后,必须指定USE命令来访问该文件,并提供文件名作为参数。 命令使指定文件成为当前设备;因此一次只能使用一个文件。 命令还可以指定模式参数。
- 然后,可以对该文件发出多个或命令。每个或命令都会向文件传送一条记录或从文件传送一条记录。除非使用模式参数打开该文件,否则无法写入该文件。尝试读取超过文件末尾会导致错误。
- 您可以使用函数设置文件位置,该位置由从连续文件的开头、当前位置或结尾开始的字符计数偏移量指定。
第四十九章 终端输入 输出 - 转义序列编程
转义序列编程
转义序列的 ANSI 标准使智能终端的编程变得实用。字符串中转义字符及其后面的所有字符不会显示在屏幕上,但会更新$X和$Y 。使用语句将转义序列发送到终端,并通过直接设置$X和$Y来保持它们最新。
标准建立了转义序列的标准语法。特定转义序列的效果取决于使用的终端类型。
每次之后在$ZB中查找传入的转义序列。 IRIS 将 标准转义序列和任何其他使用 形式的转义序列放入中。 可识别两种形式的转义序列:
常规形式
An ESC.- 可选字符
“O”(字母),十进制值79。 - 零个或多个十进制值为 的字符。
- 十进制值 的一个字符。
控制形式
- 字符,十进制值 。
- 字符,十进制值 。
- 零个或多个十进制值为 的字符。
- 零个或多个十进制值为 的字符。
- 十进制值 的一个字符。
此外,序列不能超过 个字符。违反这些形式或规则的转义序列设置的位 8,其值为 。
示例
假设正在对一个终端进行编程,其帮助键发送两个字符序列 ( ?的十进制值为 )
例程可以检测非标准转义序列,如下所示:
- 让成为。
- 当ESC出现在中时:
- 使用
Secret协议禁用echo以防止修改$X/$Y。 - 使用读取序列的其余部分;
- 关闭 以重新启用
echo。
- 使用
在下图中,要求用户输入 。如果用户按
第四十八章 终端输入 输出 - PRINT 和 ZPRINT 命令
PRINT 和 ZPRINT 命令
将当前加载的 IRIS 例程的一行或多行写入当前设备。
PRINT`具有相同的效果和参数。
语法
PRINT
ZPRINT
PRINT x
ZPRINT x
PRINT x:y
ZPRINT x:y
| 参数 | Definition 定义 |
|---|---|
(none) |
不带参数的PRINT或ZPRINT命令打印整个例程。 |
x,y |
变量和指示要打印的行范围。它们可以是 TAG+OFFSET 形式的行引用,也可以是 形式的行号。引用不在例程中的行意味着例程最后一行后面有空行。 要打印的第一行或唯一一行。 要打印的最后一行。 |
示例
此示例打印当前例程的第一行、从 INIT 开始的四行以及从 到结尾的所有行:
INIT
SET a=1
SET b=2
SET c=3
SET d=4
FINI
SET x=24
SET y=25
SET z=26
PRINT +1,INIT:INIT+3,FINI:+9999
对终端进行编程
使用 对格式化 屏幕进行编程
终端 的几个功能有助于对格式化屏幕进行编程:
- 使用
WRITE *轻松发送控制序列。 - 使用
READ接收转义序列响应。 - 使用表达式和表达式更新当前光标位置。
固定长度的
第四十七章 终端输入 输出 - DTM PC 控制台的助记符空间
DTM PC 控制台的助记符空间
IRIS 提供 IRIS 例程 %XDTM 来匹配开发 应用程序时使用的助记符。该助记词空间可用,但未设置为终端默认助记词空间。如果您将为 创建的应用程序移植到 ,可以:
- 在管理门户中将
^%XDTM配置为终端(MnemonicTerminal)的默认助记词空间,或者 - 在或命令中引用 助记符空间。
DTM 示例
OPEN "/dev/tty04/"::"^%XDTM"
Windows
OPEN "c:\sys\user"::"^%XDTM"
然后 可以正确解释WRITE /mnemonic命令中的 控制助记符,如下表所示。
DTM PC 控制台的控制助记符
| Mnemonic |
|---|
第四十六章 终端输入 输出 - CLOSE 命令
CLOSE 命令
释放设备的所有权,这是通过OPEN命令获得的。
语法
CLOSE device
终端预定义助记符空间
IRIS 提供了两个预定义的助记符空间供终端使用:
^%X364用于ANSI X3.64终端^%XDTM用于 控制台
如果激活这些助记符空间之一,则可以在WRITE /mnemonic命令中使用与它们关联的控制助记符。还可以创建自己的助记符空间。有关助记符空间的更多信息,请参阅使用助记符空间控制设备。
以下部分描述了这些助记符空间的控制助记符。
X3.64的助记符空间
为 ANSI X3.64 定义提供内置助记符空间。该助记符空间是管理器命名空间中的 IRIS 例程 。要使用例程 ,请执行以下任一操作:
- 让
IRIS系统管理员在配置设置中输入 作为默认助记符空间。从管理门户中,选择“系统管理” 、 “配置” 、 “设备设置” 、 “IO 设置” 。 - 发出指定此助记符空间的命令:
下表列出了助记符。
| Calling Sequence 调用顺序 | Name | System Variable Affected 受影响的系统变量 |
|---|
第四十五章 终端输入 输出 - WRITE 命令
WRITE 命令
将零个或多个字符写入终端
语法
WRITE *variable
WRITE *-n
WRITE #
WRITE /mnemonic
| 参数 | 定义 |
|---|---|
(none) |
不带参数的WRITE将写入当前设备上的所有局部变量。 |
*variable |
WRITE *变量写入一个字符,其十进制值等于x 。对于 字符,变量的值应为 到 范围内的整数;对于 字符,变量的值应为 。按照约定,从 到 的值表示 位 字符,而 到 表示扩展 字符集,与应用程序本身相关。如果硬件和软件设置正确, 可以处理 位数据。示例:您可以使用第八位来表示国际字符集。 例程通常使用来发送设备相关功能的控制字符。示例: 清除终端屏幕。 不会更改或 ;假设输出高度特定于输出设备。 |
| 会清除输入缓冲区。它清除等待下一个命令的所有字符。因此,所有预先输入的字符都被清除。 输入缓冲区保存从键盘到达的字符,甚至是您在例程执行命令之前键入的字符。因此,甚至可以在问题出现在屏幕上之前就回答问题。当READ命令从缓冲区获取字符时, IRIS 将它们回显到终端,以便问题和答案一起出现。当例程检测到错误时,它可能会发出来取消这些答案。 |
|
立即清除输入缓冲区。它不会等待下一个READ命令。因此,它会清除 |
第四十四章 终端输入 输出 - 特殊协议字符影响终端 I O
特殊协议字符影响终端 I O
每个操作系统都会拦截某些协议字符 (UNIX) 或组合键(例如 Windows 平台上的CTR-ALT-DEL ),以防止这些字符影响 。 控制台不会尝试覆盖这些操作系统特征。
其他特殊字符可以改变例程的执行方式,但不会出现在命令变量中。在图像模式下操作终端会取消这些效果,并使 像对待任何其他字符一样对待这些字符。
READ受输出和输入控制字符的影响。 只是读取除终止字符之外的所有其他控制字符。它不回应他们。
输出控制字符影响例程的流程和输出。下表对此进行了描述:
输出控制字符
| 输出控制字符 | 十进制值 | 定义 |
|---|---|---|
| Ctrl-C | 3 | 如果启用了中断,则Ctrl-C会中断例程的执行。该例程的行为就像发生错误。如果禁用中断,则Ctrl-C会导致 IRIS 丢弃当前中迄今为止输入的任何内容。可以使用中断需要网络操作的全局模块请求。要捕获 ,请设置特殊变量 。有关其他信息,请参阅有关启用中断的部分。 |
| Ctrl-S | 19 | 暂停到终端的输出。当 遇到Ctrl-Q时,终端输出将恢复。 |
| Ctrl-Q | 17 | 恢复由暂停的输出。 |
输入控制字符影响输入。图像模式( 协议)将这些字符视为数据,但在正常模式下它们会影响当前READ命令的输入。这些字符的描述如下表所示:
输入控制字符
第四十三章 终端输入 输出 - READ 命令
Read 命令
从键盘读取 0 到 32 KB 的内容到指定变量中。超时参数是可选的。该命令不能以井号 (#) 或冒号 () 结尾
语法
READ variable:timeout ; Variable-length read
READ variable#length:timeout ; Fixed-length read
READ *variable:timeout ; Single-character read
示例
下表提供了如何使用这些参数的几个示例。
READ 命令参数:示例
| 例子 | 影响 |
|---|---|
READ ^GLO |
从当前设备读取字符,直到找到终止符,并将结果字符串放入全局^GLO中。 |
READ X:60 |
从当前设备读取,直到找到终止符,并将读取的字符串放入变量X中。在超时之前最多等待 秒输入结束。敲击按键不会重置超时值。 |
READ *X |
从当前设备读取单个字符并将其十进制值放入局部变量X中。 |
| 从当前设备读取单个字符并将其字符串值放入局部变量X中。 | |
第四十二章 终端输入 输出 - 显式终止符
显式终止符
OPEN或USE命令中的终止符参数允许您将特定字符定义为READ或命令的终止符。这些显式终止符可用于补充指定协议提供的终止符字符。终止符参数还可用于覆盖协议对字符的指定,并将其指定为终止符。将字符重新定义为终止符的能力的例外情况是:、 以及两个输出控制字符 和。它们保留其功能,并且不能重新定义为终止符。
示例
此示例将 、 和Tab定义为主设备的终止符。下划线是连接运算符。
USE 0:("":"":"Z"_$CHAR(8,9))
通过对无主终端发出命令,您可以隐式清除 内部显式终止符列表。当出现协议字符串时, 会执行以下操作:
- 清除其显式终止符列表。
- 根据协议字符串设置协议。
- 将终止符字符串(如果有)复制到显式终止符的内部列表中。
下表给出了显式终止符字符串的示例。
| Terminator String 终止符字符串 | Definition 定义 |
|---|---|
USE 0:(80:"C":$CHAR(27)) |
转义字符终止READ,而不是开始转义序列。 |
USE 0:(80:"C":"") |
空字符串清除所有终止符。 |
USE 0:(80:"C") |
指定协议时省略终止符参数将清除所有终止符。 |
| 省略协议和终止符会使终止符保持不变。 |
读操作中的协议和终止符总结
第四十一章 终端输入 输出 - 协议终止符
协议终止符
OPEN 和 USE 协议定义了哪些 READ 输入字符、控制序列和击键被视为隐式终止符。这四种协议是 (图像模式)、(正常模式(默认))、(读取行调用模式)和 (终止符模式):
I(图像模式)接受所有256个八位字符作为数据,不将任何字符视为READ输入终止符或命令行编辑字符。因此,您应该在图像模式下仅使用单个字符或固定长度的操作。如果没有定义终止字符,普通的会导致错误。- (普通模式)和 (CRT 模式)接受除以下六种字符之外的所有字符作为数据:。其中两种字符:(换行符)和 (回车符)终止 并提交输入。 丢弃输入并发出如果启用 ,则会出现错误。 (退格)和 (删除)执行单字符退格擦除,然后继续读取。 执行多字符退格,擦除所有先前的字符,然后继续读取。
- (读取行调用模式)接受除以下 20 种以外的所有字符作为数据:。(换行)和 (回车) ) 终止 并提交输入。 丢弃输入并发出如果启用了 。其他字符执行以下命令行编辑功能:
1 ^A = beginning of line
2 ^B = back word
3 ^C = interrupt
4 ^D = delete current character
5 ^E = end of line
6 ^F = forward word
7 ^G = delete to beginning of word ("wipe word backward")
8 ^H = BS = destructive backspace
9 ^I = HT = horizontal tab (echoed as a SPACE)
10 ^J = LF = end of input
11 ^K = VT = forward character
12 ^L = FF = erase to end of line
13 ^M = CR = end of input (same as LF)
14 ^N = recall next input line
16 ^P = recall previous input line
18 ^R = back char (reverse)
21 ^U = erase to start of line
23 ^W = delete to end of word "gobble word forward")
24 ^X = erase entire line
27 ESC lead character for arrow and function keys
127 DEL = destructive backspace (same as BS)
第四十章 终端输入 输出 - 用于OPEN和USE的字母代码协议
用于OPEN和USE的字母代码协议
特殊情况或终端可能需要不同的协议。使用协议字母代码参数(或相应的关键字参数),可以更改 IRIS 与终端通信的规则。协议对正常读取和单字符读取的影响是一样的。
禁用所有特殊协议的正常模式足以满足大多数终端 I/O 的需要。在正常模式下,IRIS 会回显每个传入的 ASCII 字符,并将其发送回以显示在终端上。 或有效的转义序列结束READ命令。
对终端发出会关闭所有先前的协议,除非您使用 和 - 选项。
下表描述了有效的协议字符及其效果。
用于开放和使用的字母代码协议
| 协议字符 | 姓名 | 定义 |
|---|---|---|
| B | BREAK | 如果启用了中断 (+B),则Ctrl-C将中断正在运行的例程并使用错误。如果禁用中断 (-B),则Ctrl-C不会引起中断,并且不会显示“^C”。该协议的使用取决于登录模式默认建立的BREAK命令,如下:如果以程序员模式登录,则始终启用中断 ( )。 OPEN或命令中指定的 (或 )协议无效。如果以应用程序模式登录,则默认为 ,并且可以通过或命令中指定的 (或 )协议来启用或禁用中断。 |
| C | CRT terminal | C 模式接受所有八位字符作为数据,但以下六位字符除外:。 |
第四十章 终端输入 输出 - OPEN 和 USE 命令的关键字参数
OPEN 和 USE 命令的关键字参数
下表描述了使用OPEN和命令控制终端设备的关键字参数。对于每个关键字,该表列出了OPEN和相应的字母代码协议。有关使用这些协议的其他信息可以在字母代码协议表中找到。
终端设备的 和 关键字参数
| 关键词 | 默认 | 字母代码协议 | 描述 |
|---|---|---|---|
/BAUD=n |
/BAUD= n设置端口的调制解调器波特率。支持的值取决于操作系统支持。 /SPEED 是 的别名。 |
||
| /BREAK[= n ] | 0 | B | /BREAK 或 /BREAK= n (对于n的非零值)启用协议。 /BREAK= n如果值为零,则会禁用协议。 |
| /COMPARAMS=str | 对应于portstate位置参数。 (此关键字提供了一种以与位置无关的方式指定 COM 端口状态字节代码字符串的方法。)可以包含在str中的端口状态字节代码列在本页前面的表中。 |
||
| /COMPRESS=str | "" | 指定流数据压缩类型。可以启用 或 ZSTD 压缩类型。可以指定来禁用压缩。 相当于 。要压缩字符串,请使用 . |
|
| /CRT[=n] | 取决于操作系统终端设置 | C和P | 与 和 协议相关。 /CRT 或 /CRT= n ( n为非零值)启用 C 协议并禁用 协议。 如果值为零,则会禁用 |
第三十九章 终端输入 输出 - terminator
terminator
第三个位置参数:最多八个字符的字符串,其中任何一个都将终止READ 。这些终止符是协议中内置终止符的补充。请参阅使用终止符结束 I/O 操作。
portstate
第 个位置参数:按位置顺序最多包含 8 个字节的字符串,用于控制 COM 端口状态。端口状态字节如下(字节从开始按从左到右的顺序编号):
| Byte 字节 | 意义 | Values |
|---|---|---|
| 1 | Disconnect 断开 |
D=断开(挂断)端口。空白=不断开端口。 |
| 2 | Modem Control 调制解调器控制 | 1=使用调制解调器控制。0=不使用调制解调器控制。空白=调制解调器控制没有变化。 |
| 3 | Data Bits 数据位 | 5=五个数据位。 =六个数据位。 7=七个数据位。 =八个数据位。空白=数据位设置没有变化。 |
| 4 | Parity 平价 | =无奇偶校验。 =奇校验。 2=偶校验。 =标记奇偶校验。 =空间奇偶校验。空白=奇偶校验设置没有更改。 |
| 5 | 停止位 | =一个停止位。 =1.5 个停止位。=两个停止位。空白=停止位设置没有变化。 |
| 6 | 流量控制 | =使用Xon/Xoff流量控制。 C=使用CTS/RTS流量控制。 =使用DSR/DTR流量控制。 N=禁用流量控制。空白=不改变流量控制。 |
| 7 | 数据传输设置 | =禁用 |
第三十八章 终端输入 输出 - USER命令
USER命令
使指定终端成为当前设备。在编程器模式下,同一行代码上的所有后续 I/O 命令都引用该设备。在应用程序模式下,您在USE命令中命名的设备将一直保留为当前设备,直到下一个USE命令为止。
USE 语法
命令采用以下参数:
USE terminal:(margin:protocols:terminator):"mnespace"
终端参数可以是一个表达式,其值为终端设备的名称。零 (0) 是该进程的主要设备。 $IO是当前设备。终端的最大长度为 个字符。
参数由冒号 () 分隔。如果省略参数,则必须指定冒号。命令或其参数列表不得以冒号结束。
可选参数列表包含在括号中,可以包含、 和参数。可以将可选的 、 和参数指定为位置参数(按所示顺序),或使用语法 指定为关键字参数。关键字参数可以按任意顺序指定;由于 按从左到右的顺序执行参数,因此在某些情况下,参数之间的交互可能决定首选顺序。可以在同一参数列表中混合位置参数和关键字参数。如果指定多个参数,则需要使用括号。
要使用USE命令指定 端口状态和波特率,请使用适当的关键字参数。
在参数列表(或占位符冒号,如果未指定参数列表)后面,可以指定一个可选的参数,该参数标识一个 ObjectScript 例程,其中定义了与
– 2个新公告
– 1个新问题
✓ 十一月有 32 位新成员加入
✓ 所有时间发布了 2,284 篇帖子
✓ 所有时间有 2,071 位成员加入
第三十七章 终端输入 输出 - $ZB 显示结束读取的内容
$ZB 显示结束读取的内容
$ZB显示当前设备上最后一次READ操作结束的字符序列或事件。不能设置$ZB ;每次执行READ时, 都会设置的值。可以使用此值来作用于不可打印的字符,例如向上箭头键或功能键。
可以包含以下任意内容:
- 终止符,例如回车符
- 转义序列
- 固定长度
READ x#y的字符数y READ *x的单个字符- 定时读取过期后出现空字符串
$ZB永远不会包含超过 个字符。较长的转义序列无效。
$ZB 示例
以下示例将用户指定的输入字符分配给命令变量 ,并将输入终止符(通常是 字符)分配给特殊变量。从终端提示符发出此命令时,您需要设置一个变量以在与命令相同的命令行上捕获的值。这是因为用于发出命令行的行返回被写入作为终止符。此示例使用显示捕获的字符的值。
OPEN and USE 命令
命令
建立终端的所有权。可选参数列表可以设置右边距、指定设备协议以及指定一个或多个终止字符。在参数列表之后,可以选择指定超时参数和或参数。 参数指定 例程,其中定义了与 一起使用的控制助记符。
会暂停该过程,直到系统完成打开设备。如果按中断命令,则会出现错误结果。
除非指定超时,否则会保留控制权,直至设备打开完成。超时后,如果
第三十六章 终端输入 输出 - 开关控制 $X 的转义序列更新
开关控制 $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 |
$TEST 显示定时操作结果
特殊变量由采用超时值的命令设置。这些命令包括OPEN和READ 。 的值可以设置为 或 :
- 如果定时命令在超时到期之前成功,则
$TEST设置为1。 - 如果定时命令超时, 将设置为 。
注:没有超时的和命令对$TEST没有影响。
显示读取状态
特殊变量包含许多位标志,显示当前设备上最后一次的状态。不能设置 ; 控制其价值。 在下一次之前保持有效。 包含表中列出的值的总和,这显示了程序如何测试此变量。 ( 还包含调制解调器连接状态的位标志,此处未列出。)
$ZA 读取状态值
| Value | Test | Meaning |
|---|---|---|
1 |
$ZA#2 |
无论是否启用了中断,都会出现Ctrl-C 。 |
$ZA\2#2 |
第三十五章 终端输入 输出 - 特殊变量显示 I O 条件
WRITE * and $X and $Y
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
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 客户端 服务器通信
本页介绍如何使用 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 高级主题
本页讨论使用 TCP/IP 在 IRIS 数据平台进程之间进行通信的几个高级主题。
连接管理
服务器一次仅维护一个连接。如果在另一个连接打开时第二个客户端尝试连接,TCP/IP 会将该客户端放入队列中。在队列中时,第二个客户端可以向端口写入数据,就像已连接一样。第二个客户端写入的数据保留在缓冲区中,直到第一个连接关闭并且第二个客户端连接为止。
如果第二个客户端在连接存在之前发出,则会挂起。当第二个客户端在队列中时,第三个客户端的任何连接尝试都会失败。
如果已经打开 TCP 设备的客户端在第一个连接仍然存在时尝试第二次连接,则第二个OPEN命令会导致错误。将这种情况视为错误而不是USE命令可以防止出现意外的结果。如果错误的程序认为它已打开新连接,而实际上它正在重用可能具有不同目标或不同参数的现有连接,则可能会出现此类意外结果。
设备的作业命令
可以使用命令来实现TCP并发服务器。 并发服务器允许同时为多个客户端提供服务。在这种模式下,客户端不必等待服务器完成为其他客户端提供服务。相反,每次客户端请求服务器时,它都会为该客户端生成一个单独的子作业,只要客户端需要它,该子作业就会保持打开状态。一旦生成该子作业(由JOB命令的返回指示),另一个客户端就可以请求服务,并且服务器也将为该客户端创建一个子作业。
非并发和并发模式下的客户端/服务器连接。
并发服务器使用
第三十章 TCP 客户端 服务器通信 - 作业服务器资源
作业服务器资源
如果正在编写一个IRIS服务器来与无法控制的客户端连接,则服务器进程必须发出CLOSE命令来关闭TCP连接。就 而言,命令确实会关闭连接,但是在内部会在服务器上为这个连接保留最长两分钟的资源。
当用于为作业提供服务时,可能会产生意想不到的结果。当一个JOBSERVER进程执行暂停时,该进程立即返回到可用的进程池,但其资源在内部保留最多两分钟。由于进程是在第一个可用的基础上分配的,因此来自数量相对较少的客户机的重载可能会耗尽进程的资源。
为了避免这个问题,在下运行的打开的TCP/IP服务器应该显式地发出一个命令,然后在最后的或)命令之前发出一个简短的命令。根据规范,需要一个 来保证在的转世之间没有资源仍在使用。在实践中,一秒的通常足以在进程之间均匀地分配资源负载。
自动切断
绑定连接在以下条件下自动关闭:
-
IRIS致命错误 -
客户端或服务器进程
的RESJOB -
iris stop -
iris force
断开连接的影响
断开连接对保留在输出缓冲区中的数据的影响由OPEN或期间建立的/CLOSEFLUSH
第二十九章 TCP 客户端 服务器通信 - 记录的拼接
记录的拼接
在某些情况下,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
第二十八章 TCP 客户端 服务器通信 - JOB命令示例
JOB命令示例
以下示例显示了一个非常简单的并发服务器,只要它检测到来自客户端的连接,就会产生一个子作业。 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 客户端 服务器通信 - 连接管理
连接管理
服务器一次只维护一个连接。如果第二个客户端在另一个连接打开时尝试连接,则 TCP/IP 将该客户端放入队列中。在队列中时,第二个客户端可以像已连接一样写入端口。第二个客户端写入的数据保留在缓冲区中,直到第一个连接关闭并且第二个客户端连接。
如果第二个客户端在连接存在之前发出 READ,它就会挂起。当第二个客户端在队列中时,第三个客户端的任何连接尝试都会失败。
如果已经打开 TCP 设备的客户端在第一个连接仍然存在时尝试第二次连接,则第二个 OPEN 命令会导致 错误。将这种情况视为错误而不是 命令可以防止出现意外结果。如果一个错误的程序认为它打开了一个新连接,而实际上它正在重用一个可能具有不同目标或不同参数的现有连接,则可能会出现这种意想不到的结果。
TCP 设备的作业命令
可以使用 命令来实现 TCP 并发服务器。 并发服务器允许同时为多个客户端提供服务。在这种模式下,客户端不必等待服务器完成对其他客户端的服务。相反,每次客户端请求服务器时,它都会为该客户端生成一个单独的子作业,只要客户端需要它,该子作业就会保持打开状态。一旦生成此子作业(由 命令的返回指示),另一个客户端可能会请求服务,服务器也会为该客户端创建一个子作业。
非并发和并发模式下的客户端/服务器连接。
第二十六章 TCP 客户端 服务器通信 - $ZB 和 READ 命令
$ZB 和 READ 命令
$ZB 保存终止读取的字符。该字符可以是以下之一:
- 终止字符,例如回车
- 固定长度
READ x#y的第y个字符 READ *X的单个字符- 定时读取过期后的空字符串
- 转义序列
- 请注意,如果一个字符串以 结尾,则只有
CR会放在 中。
设备的 命令
在使用 OPEN 和 建立连接后, 命令将数据从客户端或服务器发送到 设备。
语法如下:
如何工作
WRITE x 在建立连接后将 从客户端或服务器发送到缓冲区。
和 不表示换行和换页。相反,它们告诉 刷新缓冲区中保留的所有字符,并通过网络将它们发送到目标系统。
可以使用 类的 方法确定当前 连接执行的写入次数。
修改 和
将缓冲区中的字符数存储在 特殊变量中。
字符 和 不包括在此计数中,因为它们不被视为记录的一部分。用 刷新缓冲区!将 重置为 ,并将 的值增加 。使用 刷新缓冲区将 作为单独的记录写入,并将 重置为 。
命令错误
在以下任何情况下,都可能收到 错误。
- 如果超过最大字符串大小(
1024个字符)而不刷新缓冲区。 - 如果在其中没有字符时刷新写入缓冲区(
TCP/IP忽略长度为 的记录)。

