文章 姚 鑫 · 十二月 7, 2024 2m read

第四十三章 终端输入 输出 - READ 命令

Read 命令

从键盘读取 032 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中。
0
0 124
文章 姚 鑫 · 十二月 6, 2024 2m read

第四十二章 终端输入 输出 - 显式终止符

显式终止符

OPENUSE命令中的终止符参数允许您将特定字符定义为READ或命令的终止符。这些显式终止符可用于补充指定协议提供的终止符字符。终止符参数还可用于覆盖协议对字符的指定,并将其指定为终止符。将字符重新定义为终止符的能力的例外情况是:、 以及两个输出控制字符 和。它们保留其功能,并且不能重新定义为终止符。

示例

此示例将 、 和Tab定义为主设备的终止符。下划线是连接运算符。

  USE 0:("":"":"Z"_$CHAR(8,9))

通过对无主终端发出命令,您可以隐式清除 内部显式终止符列表。当出现协议字符串时, 会执行以下操作:

  1. 清除其显式终止符列表。
  2. 根据协议字符串设置协议。
  3. 将终止符字符串(如果有)复制到显式终止符的内部列表中。

下表给出了显式终止符字符串的示例。

Terminator String 终止符字符串 Definition 定义
USE 0:(80:"C":$CHAR(27)) 转义字符终止READ,而不是开始转义序列。
USE 0:(80:"C":"") 空字符串清除所有终止符。
USE 0:(80:"C") 指定协议时省略终止符参数将清除所有终止符。
省略协议和终止符会使终止符保持不变。

读操作中的协议和终止符总结

0
0 113
文章 姚 鑫 · 十二月 5, 2024 3m read

第四十一章 终端输入 输出 - 协议终止符

协议终止符

OPENUSE 协议定义了哪些 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)
0
0 105
文章 姚 鑫 · 十二月 4, 2024 5m read

第四十章 终端输入 输出 - 用于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 模式接受所有八位字符作为数据,但以下六位字符除外:。
0
0 103
文章 姚 鑫 · 十二月 3, 2024 4m read

第四十章 终端输入 输出 - OPEN 和 USE 命令的关键字参数

OPENUSE 命令的关键字参数

下表描述了使用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 协议并禁用 协议。 如果值为零,则会禁用
0
0 97
文章 姚 鑫 · 十二月 2, 2024 4m read

第三十九章 终端输入 输出 - 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 数据传输设置 =禁用
0
0 129
文章 姚 鑫 · 十二月 1, 2024 3m read

第三十八章 终端输入 输出 - USER命令

USER命令

使指定终端成为当前设备。在编程器模式下,同一行代码上的所有后续 I/O 命令都引用该设备。在应用程序模式下,您在USE命令中命名的设备将一直保留为当前设备,直到下一个USE命令为止。

USE 语法

命令采用以下参数:

USE terminal:(margin:protocols:terminator):"mnespace"

终端参数可以是一个表达式,其值为终端设备的名称。零 (0) 是该进程的主要设备。 $IO是当前设备。终端的最大长度为 个字符。

参数由冒号 () 分隔。如果省略参数,则必须指定冒号。命令或其参数列表不得以冒号结束。

可选参数列表包含在括号中,可以包含、 和参数。可以将可选的 、 和参数指定为位置参数(按所示顺序),或使用语法 指定为关键字参数。关键字参数可以按任意顺序指定;由于 按从左到右的顺序执行参数,因此在某些情况下,参数之间的交互可能决定首选顺序。可以在同一参数列表中混合位置参数和关键字参数。如果指定多个参数,则需要使用括号。

要使用USE命令指定 端口状态和波特率,请使用适当的关键字参数。

在参数列表(或占位符冒号,如果未指定参数列表)后面,可以指定一个可选的参数,该参数标识一个 ObjectScript 例程,其中定义了与

0
0 158
公告 Michael Lei · 十二月 1, 2024
您好,欢迎阅读 十一月 2024 开发人员社区通讯。
统计信息
✓ 十一月发布了 33 篇新帖子:
30篇新文章
2个新公告
1个新问题

✓ 十一月有 32 位新成员加入
✓ 所有时间发布了 2,284 篇帖子
✓ 所有时间有 2,071 位成员加入

0
0 75
文章 姚 鑫 · 十一月 30, 2024 3m read

第三十七章 终端输入 输出 - $ZB 显示结束读取的内容

$ZB 显示结束读取的内容

$ZB显示当前设备上最后一次READ操作结束的字符序列或事件。不能设置$ZB ;每次执行READ时, 都会设置的值。可以使用此值来作用于不可打印的字符,例如向上箭头键或功能键。

可以包含以下任意内容:

  • 终止符,例如回车符
  • 转义序列
  • 固定长度READ x#y的字符数y
  • READ *x的单个字符
  • 定时读取过期后出现空字符串

$ZB永远不会包含超过 个字符。较长的转义序列无效。

$ZB 示例

以下示例将用户指定的输入字符分配给命令变量 ,并将输入终止符(通常是 字符)分配给特殊变量。从终端提示符发出此命令时,您需要设置一个变量以在与命令相同的命令行上捕获的值。这是因为用于发出命令行的行返回被写入作为终止符。此示例使用显示捕获的字符的值。

OPEN and USE 命令

命令

建立终端的所有权。可选参数列表可以设置右边距、指定设备协议以及指定一个或多个终止字符。在参数列表之后,可以选择指定超时参数和或参数。 参数指定 例程,其中定义了与 一起使用的控制助记符。

会暂停该过程,直到系统完成打开设备。如果按中断命令,则会出现错误结果。

除非指定超时,否则会保留控制权,直至设备打开完成。超时后,如果

0
0 101
文章 姚 鑫 · 十一月 29, 2024 2m read

第三十六章 终端输入 输出 - 开关控制 $X 的转义序列更新

开关控制 $X 的转义序列更新

要选择非默认行为来更新进程的$X ,请发出%SYSTEM.Process类的 DX( n ) 方法。

系统管理员可以通过类中设置 的DX属性来更改系统范围的默认行为。

在这两种情况下, 的值都在 04 之间,如下所示:

Value Default Behavior for Updating $X
0 Default for InterSystems IRIS
1 DSM behavior
2 DTM/MSM behavior

$TEST 显示定时操作结果

特殊变量由采用超时值的命令设置。这些命令包括OPENREAD 。 的值可以设置为 或 :

  • 如果定时命令在超时到期之前成功,则$TEST设置为 1
  • 如果定时命令超时, 将设置为 。

注:没有超时的和命令对$TEST没有影响。

显示读取状态

特殊变量包含许多位标志,显示当前设备上最后一次的状态。不能设置 ; 控制其价值。 在下一次之前保持有效。 包含表中列出的值的总和,这显示了程序如何测试此变量。 ( 还包含调制解调器连接状态的位标志,此处未列出。)

$ZA 读取状态值

Value Test Meaning
1 $ZA#2 无论是否启用了中断,都会出现Ctrl-C
$ZA\2#2
0
0 83
文章 姚 鑫 · 十一月 28, 2024 2m read

第三十五章 终端输入 输出 - 特殊变量显示 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

转义序列对 和 的影响各不相同

转义序列可以改变和值上的回显效果。三个因素控制着这种影响:

  • 操作系统,设置默认行为。
  • 是否在OPENUSE命令中指定了 (禁用和处理)。
  • 可以使用类的 方法来设置如何处理当前进程的转义序列。可以通过类中设置 的 属性来建立系统范围的默认行为。

转义序列影响 和 系统上的 $X

默认情况下,在 和

0
0 88
文章 姚 鑫 · 十一月 27, 2024 2m read

第三十四章 终端输入 输出

概述

ObjectScript 提供支持串行异步 ASCII 终端的命令。还可以将这些命令与控制台 I/O 结合使用。

使用终端 ,例程可以:

  • 启用或禁用传入字符的回显。
  • 发送和接收 ANSI 标准转义序列。
  • 控制键盘中断并编程特殊的用户交互,包括格式化屏幕、反向视频和用于跳过字段的特殊键。
  • 启用和禁用Ctrl-C中断的识别。
  • 通过 XON ( ) 和 ( ) 控制传入和传出数据流。
  • 指定 端口状态参数和调制解调器波特率。
  • 当指定自己的终止字符集时,请遵循外部协议。
  • 与非终端设备通信,例如自动化仪器。

在大多数平台上,打印机被视为终端 设备。 系统始终将打印机作为终端 I/O 设备来处理。在 上,通过串行通信端口连接的打印机被视为终端 设备。否则, 系统将打印机作为顺序文件 设备处理。

登录终端或控制台是主要设备

登录 的终端或控制台是主要设备。无需打开主要设备。如果尚未发出和 ,则进程第一次发出或时,系统会自动打开主设备,并将其设置为当前设备,就像您已显式发出一样。

在本页的其余部分中, “终端”一词用于指代终端和控制台。

特殊变量显示 条件

命令可以影响特殊变量的值。您可以测试这些变量以确定 条件:

  • 包含当前设备的名称。
  • $TEST包含一个布尔值,显示最近的定时操作是否成功。
  • $X$Y显示光标的位置。
  • 、 和显示有关操作的信息。 和
0
0 85
文章 姚 鑫 · 十一月 26, 2024 2m read

第三十三章 UDP 客户端 服务器通信 - IPv4 和 IPv6

UDP 支持 IPv4IPv6 互联网协议。由于这些协议不兼容,服务器和客户端都必须使用相同的协议,否则传输将失败。

地址具有以下格式。 是 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() 

以下是 传输:

处理主机地址的方法可在类文档中找到。

0
0 145
文章 姚 鑫 · 十一月 25, 2024 3m read

第三十二章 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)
0
0 115
文章 姚 鑫 · 十一月 24, 2024 5m read

第三十一章 TCP 高级主题

本页讨论使用 TCP/IPIRIS 数据平台进程之间进行通信的几个高级主题。

连接管理

服务器一次仅维护一个连接。如果在另一个连接打开时第二个客户端尝试连接,TCP/IP 会将该客户端放入队列中。在队列中时,第二个客户端可以向端口写入数据,就像已连接一样。第二个客户端写入的数据保留在缓冲区中,直到第一个连接关闭并且第二个客户端连接为止。

如果第二个客户端在连接存在之前发出,则会挂起。当第二个客户端在队列中时,第三个客户端的任何连接尝试都会失败。

如果已经打开 TCP 设备的客户端在第一个连接仍然存在时尝试第二次连接,则第二个OPEN命令会导致错误。将这种情况视为错误而不是USE命令可以防止出现意外的结果。如果错误的程序认为它已打开新连接,而实际上它正在重用可能具有不同目标或不同参数的现有连接,则可能会出现此类意外结果。

设备的作业命令

可以使用命令来实现TCP并发服务器。 并发服务器允许同时为多个客户端提供服务。在这种模式下,客户端不必等待服务器完成为其他客户端提供服务。相反,每次客户端请求服务器时,它都会为该客户端生成一个单独的子作业,只要客户端需要它,该子作业就会保持打开状态。一旦生成该子作业(由JOB命令的返回指示),另一个客户端就可以请求服务,并且服务器也将为该客户端创建一个子作业。

非并发和并发模式下的客户端/服务器连接。

并发服务器使用

0
0 108
文章 姚 鑫 · 十一月 23, 2024 2m read

第三十章 TCP 客户端 服务器通信 - 作业服务器资源

作业服务器资源

如果正在编写一个IRIS服务器来与无法控制的客户端连接,则服务器进程必须发出CLOSE命令来关闭TCP连接。就 而言,命令确实会关闭连接,但是在内部会在服务器上为这个连接保留最长两分钟的资源。

当用于为作业提供服务时,可能会产生意想不到的结果。当一个JOBSERVER进程执行暂停时,该进程立即返回到可用的进程池,但其资源在内部保留最多两分钟。由于进程是在第一个可用的基础上分配的,因此来自数量相对较少的客户机的重载可能会耗尽进程的资源。

为了避免这个问题,在下运行的打开的TCP/IP服务器应该显式地发出一个命令,然后在最后的或)命令之前发出一个简短的命令。根据规范,需要一个 来保证在的转世之间没有资源仍在使用。在实践中,一秒的通常足以在进程之间均匀地分配资源负载。

自动切断

绑定连接在以下条件下自动关闭:

  • IRIS致命错误

  • 客户端或服务器进程的RESJOB

  • iris stop

  • iris force

断开连接的影响

断开连接对保留在输出缓冲区中的数据的影响由OPEN或期间建立的/CLOSEFLUSH

0
0 72
文章 姚 鑫 · 十一月 22, 2024 2m read

第二十九章 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
0
0 101
文章 Louis Lu · 十一月 22, 2024 1m read

当我们将 InterSystems IRIS 安装在Windows 系列操作系统中时,往往同时使用IIS 作为其Web 服务器。

但这时候我们却发现,由RESTful返回的错误信息却不能正常显示出来了,特别是在调试程序的时候,非常不方便。

比如在测试 FHIR Post/Put 请求时,我们的请求消息体中包含不正确的内容,这时我可以看到返回的是HTTP 400 Bad Request的返回内容.

我无法具体知道请求消息体哪句出错了,这对我调试程序造成很大困扰。

解决方法:

1. 打开IIS的管理页面,双击 错误页

2. 选择右侧 编辑功能设置

3. 选择错误响应下的 详细错误 选项。

我们再次请求,此时可以看到页面上显示了详细的错误信息

相关详细信息可以查看文档:Configuring IIS to Return SOAP Fault Details 以及

0
0 193
文章 姚 鑫 · 十一月 21, 2024 2m read

第二十八章 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 }
0
0 106
文章 姚 鑫 · 十一月 20, 2024 3m read

第二十七章 TCP 客户端 服务器通信 - 连接管理

连接管理

服务器一次只维护一个连接。如果第二个客户端在另一个连接打开时尝试连接,则 TCP/IP 将该客户端放入队列中。在队列中时,第二个客户端可以像已连接一样写入端口。第二个客户端写入的数据保留在缓冲区中,直到第一个连接关闭并且第二个客户端连接。

如果第二个客户端在连接存在之前发出 READ,它就会挂起。当第二个客户端在队列中时,第三个客户端的任何连接尝试都会失败。

如果已经打开 TCP 设备的客户端在第一个连接仍然存在时尝试第二次连接,则第二个 OPEN 命令会导致 错误。将这种情况视为错误而不是 命令可以防止出现意外结果。如果一个错误的程序认为它打开了一个新连接,而实际上它正在重用一个可能具有不同目标或不同参数的现有连接,则可能会出现这种意想不到的结果。

TCP 设备的作业命令

可以使用 命令来实现 TCP 并发服务器。 并发服务器允许同时为多个客户端提供服务。在这种模式下,客户端不必等待服务器完成对其他客户端的服务。相反,每次客户端请求服务器时,它都会为该客户端生成一个单独的子作业,只要客户端需要它,该子作业就会保持打开状态。一旦生成此子作业(由 命令的返回指示),另一个客户端可能会请求服务,服务器也会为该客户端创建一个子作业。

非并发和并发模式下的客户端/服务器连接。

0
0 163
文章 姚 鑫 · 十一月 19, 2024 2m read

第二十六章 TCP 客户端 服务器通信 - $ZB 和 READ 命令

$ZBREAD 命令

$ZB 保存终止读取的字符。该字符可以是以下之一:

  • 终止字符,例如回车
  • 固定长度 READ x#y 的第 y 个字符
  • READ *X 的单个字符
  • 定时读取过期后的空字符串
  • 转义序列
  • 请注意,如果一个字符串以 结尾,则只有 CR 会放在 中。

设备的 命令

在使用 OPEN 和 建立连接后, 命令将数据从客户端或服务器发送到 设备。

语法如下:

如何工作

WRITE x 在建立连接后将 从客户端或服务器发送到缓冲区。

和 不表示换行和换页。相反,它们告诉 刷新缓冲区中保留的所有字符,并通过网络将它们发送到目标系统。

可以使用 类的 方法确定当前 连接执行的写入次数。

修改 和

将缓冲区中的字符数存储在 特殊变量中。

字符 和 不包括在此计数中,因为它们不被视为记录的一部分。用 刷新缓冲区!将 重置为 ,并将 的值增加 。使用 刷新缓冲区将 作为单独的记录写入,并将 重置为 。

命令错误

在以下任何情况下,都可能收到 错误。

  • 如果超过最大字符串大小(1024 个字符)而不刷新缓冲区。
  • 如果在其中没有字符时刷新写入缓冲区(TCP/IP 忽略长度为 的记录)。
0
0 106
文章 姚 鑫 · 十一月 18, 2024 2m read

第二十五章 TCP 客户端 服务器通信 - TCP 设备的 READ 命令

TCP 设备的 READ 命令

从服务器或客户端发出 READ 命令以读取客户端或服务器设置的任何字符。

语法如下:

READ var:timeout 
READ *var:timeout
READ var#length:timeout

超时参数虽然是可选的,但强烈建议使用,因为如果指定了超时,则 READ 的成功或失败由 $TEST 特殊变量的值指示。如果在超时到期之前读取尝试成功,则 设置为 ;如果超时到期, 设置为 。

超时参数支持秒和秒的分数到 秒。例如,、、、。

对于 连接,如果连接建立后另一方从未发出读或写命令,则作业可以等待第一个读或第一个写命令。在这种情况下, 支持 READ 命令的读取超时和 命令的写入超时(使用 选项)。如果没有指定读或写超时,则作业将等待,直到对方发出读或写命令。

可以使用 类的 方法确定当前 TCP 连接执行的读取次数。

修改 和

应用程序可以通过测试 和 的值来了解连接和读取是如何成功的。

和 命令

报告连接状态。当设置 位 () 时,此 设备在服务器模式下运行。当设置 位 () 时,设备当前处于与远程主机通信的连接状态。

$ZA Value $TEST Value Meaning
4096 0
0
0 92
文章 姚 鑫 · 十一月 17, 2024 3m read

第二十四章 TCP 客户端 服务器通信 - 当前 TCP 设备

当前 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>
 
0
0 102
文章 姚 鑫 · 十一月 15, 2024 7m read

第二十二章 TCP 客户端 服务器通信 - TCP设备的OPEN和USE命令关键字

TCP设备的OPENUSE命令关键字

可以使用位置参数(如上所述)或关键字参数。下表描述了使用和命令控制TCP设备的关键字。还有其他只能在命令中指定的关键字(本章稍后将描述)。所有关键字参数都是可选的。

设备的和USE命令关键字

Keyword Default Description
/ABSTIMEOUT[=1] 0 指定读超时行为。确定TCP在接收到数据时是否应重新初始化超时时间。如果/ABSTIMEOUT=0(默认值),则每次接收数据时timeout都会重置为原始值。如果/ABSTIMEOUT或,则在接收数据时超时时间继续倒数。
0 对应于“”模式参数字符,该参数指定一旦接受来自客户端作业的连接,服务器上的初始读取就以零长度字符串终止。和/ACCEPT=n对于的非零值启用模式。表示零值禁用模式。
指定当设备关闭时,对保留在输出缓冲区中的数据的处理。和对于n的非零值将刷新剩余数据。表示为零时丢弃剩余数据。
指定流数据压缩类型。可以启用压缩类型为或。可以指定来禁用压缩。等价于。要压缩字符串,使用。
对应于模式参数字符,它修改输入和输出时回车的处理。和为的非零值启用模式。对于零值禁用模式。
对应于
0
0 128
文章 姚 鑫 · 十一月 14, 2024 2m read

第二十一章 TCP 客户端 服务器通信 - 客户端OPEN命令

客户端OPEN命令

客户端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
0
0 114
文章 姚 鑫 · 十一月 13, 2024 3m read

第二十章 TCP 客户端 服务器通信 - 立即发送模式(Q 模式)

立即发送模式(Q 模式)

在立即发送模式下,每个 WRITE 命令都作为其自己的数据包输出。如果不使用立即发送模式,则必须包括终止符或发出命令 WRITE *–3 以输出数据包。

通过指定“Q”模式字符或(或/SEN)关键字参数进入此模式。要关闭此选项,请指定以下任一选项:

   USE TCPDEVICE:(/SEN=0)
   USE TCPDEVICE:(::"-Q")

要重新打开此选项,请指定以下任一选项:

   USE TCPDEVICE:(/SEN=1)
   USE TCPDEVICE:(::"+Q")

立即发送模式与模式结合使用,前者在每次写入时创建一个包,后者在创建每个包时立即发送。当这两个选项都启用时,单个数据突发的传输速度将最大化。当每个数据单元的及时传送至关重要时,例如在传输鼠标移动时,这是有用的。当两者都关闭时,一个数据包可能包含多个写入,一个传输可能包含多个数据包。这减少了网络流量并提高了整体性能。立即发送模式的默认设置为关闭。模式的默认设置为打开。

流模式(模式)

在流模式下, 不会保留数据流中的TCP消息边界。发送时,如果数据不适合消息缓冲区, 会在将数据放入缓冲区之前刷新缓冲区。

接收时,可以接收最大字符串长度的数据。所有读取都等待达到终止符或缓冲区变满的完全超时。

0
0 131
文章 姚 鑫 · 十一月 12, 2024 3m read

第十九章 TCP 客户端 服务器通信 - 数据包模式

数据包模式

如果未指定模式,则默认为数据包模式。如果流模式被禁用,则该模式默认为分组模式。

在分组模式中,只要有一些数据要返回,读取命令就会完成。数据包模式允许在输出缓冲区中构建整个TCP数据段,然后通过发出WRITE*-3WRITE!命令。

如果在没有要发送的字符的情况下发出来启动一个发送操作,则会收到一个错误。如果发出空字符串,则会收到错误。

在分组模式下可以发送的字符串的最大长度为1024个字符。如果在未刷新缓冲区的情况下超过此限制,则会收到错误。

因为 TCP/IP 忽略长度为 的记录,所以如果在其中没有字符时刷新写入缓冲区,会收到 错误。

在服务器收到连接请求之前,从服务器到客户端的命令会在服务器上产生 错误。

回车模式(模式)

此模式修改对输入和输出的回车处理。

在输出时, 生成,而WRITE#生成。

在输入时,在启用模式的情况下,服务器尝试将相邻的和或相邻的和记录为中的单个终止符。如果和没有在彼此的短时间间隔内到达,则将它们作为单独的终结器进行处理。默认情况下,间隔为秒。

监控断开模式(模式)

此模式打开或关闭异步断开监控。通过指定模式字符或关键字参数来激活此模式。当指定时,将激活断开监视;当指定时,将停用断开监视。

当被激活时,大约每隔秒轮询一次连接。当检测到断开连接时,会发出一个错误。

0
0 82
文章 姚 鑫 · 十一月 11, 2024 4m read

第十八章 TCP 客户端 服务器通信 - 使用OPEN命令 - Supported参数

Supported 参数

parameters 参数可以是以下格式之一:

hostname
(hostname{:port{:mode{:terminators{:ibufsiz{:obufsiz{:queuesize{:keepalivetime}}}}}}})

parameters 参数中的参数如下:

  • hostname - 可选 — IP 主机的名称、IPv4 协议格式的 地址或 协议格式的 地址。指定为带引号的字符串。客户端 需要主机名;对于服务器端 ,省略(由占位符冒号表示)。

  • - 可选 — 如果存在,这是用于连接的 端口号。如果此端口号为空或省略,则端口号从设备名称的数字部分派生。该参数可以是十进制的端口号,也可以是服务名,提交给本地系统的TCP服务名解析器。

  • - 可选——用引号括起来的字母代码字符的字符串。字母代码可以按任何顺序指定;由于 按从左到右的顺序执行字母代码,因此字母代码之间的交互在某些情况下可能决定首选顺序。默认为数据包模式。模式字符串可以由以下一个或多个字母代码组成:

    • A-接受模式。如果A处于打开状态,则在接受来自客户端作业的连接后,服务器上的初始读取将立即以零长度字符串终止。
0
0 110
文章 姚 鑫 · 十一月 10, 2024 3m read

第十七章 TCP 客户端 服务器通信 - 使用OPEN命令

使用OPEN命令

OPEN命令保留一个TCP绑定设备供使用。其语法为:

OPEN devicename:parameters:timeout:mnespace
  • devicename - 一个|TCP|格式的字符串,后面跟着一些数字数字。设备名称的数字部分称为设备标识符。如果OPEN参数中没有指定端口号,则该设备标识符必须是唯一的位端口号。如果在参数中指定了端口号(这是首选的实践),这个设备标识符可以是任何唯一的数字(最多),只要单个作业使用的所有TCP设备名称是不同的。

  • - 可选-一系列一个或多个设备参数,用括号括起来,用冒号()分隔。如果省略了某个参数,请为缺少的参数指定冒号分隔符。(对于服务器端OPEN,始终省略第一个参数。)。具体参数说明如下。

    如果只指定第一个参数(),可以省略括号。例如客户端。如果不指定参数,则可以省略圆括号,但必须保留冒号作为分隔符。例如:服务器端。

  • - 可选- 尝试打开TCP设备的最大秒数。如果在此间隔内没有成功,它会将设置为,并将控制权返回给进程。如果成功,它会将设置为。在来自客户端的命令中包含超时可防止客户端系统在服务器忙于处理另一个客户端时尝试打开连接时挂起。服务器一次只能打开一个连接。

  • - 可选-支持所有的对象脚本OPEN命令。没有用于绑定的预定义助记符空间。

0
0 116
文章 姚 鑫 · 十一月 9, 2024 3m read

第十六章 TCP 客户端/服务器通信

TCP 客户端/服务器通信

本章介绍如何使用 TCP/IPIRIS 数据平台进程之间设置远程通信。

IRIS 支持两种互联网协议 ():TCP 和 。这些 协议允许 进程与本地或远程系统上的进程通信,无论这些进程是否正在运行 。

  • TCP IRIS 传输控制协议 (TCP) 绑定。在服务器和单个客户端之间建立双向连接。提供具有错误检查和纠正以及消息确认的可靠字节流数据传输。
  • UDP IRIS 用户数据报协议 () 绑定。提供服务器和大量客户端之间的双向消息传输。 不是基于连接的;每次传输数据包都是一个独立的事件。为本地数据包广播和远程多播提供快速和轻量级的数据传输。本质上不如 可靠。不提供消息确认。

TCP 绑定将 连接到广泛的网络标准,这样 IRIS 用户就可以通过 命令使用底层网络协议的基本功能。

协议允许系统进行通信,即使它们使用不同类型的网络硬件。例如, 通过 连接在使用以太网的系统和使用令牌环的另一个系统之间传输消息。 控制数据传输的准确性。 或 协议在网络或 上的不同系统之间执行实际数据传输。

使用 绑定,可以创建客户端-服务器系统的客户端和服务器部分。在客户端-服务器类型的分布式数据库系统中,一个或多个客户端系统上的用户可以处理存储在另一个系统(称为服务器)上的数据库中的信息。

连接概述

0
0 109