第三十一章 TCP 高级主题
本页讨论使用 TCP/IP
在 IRIS
数据平台进程之间进行通信的几个高级主题。
连接管理
服务器一次仅维护一个连接。如果在另一个连接打开时第二个客户端尝试连接,TCP/IP
会将该客户端放入队列中。在队列中时,第二个客户端可以向端口写入数据,就像已连接一样。第二个客户端写入的数据保留在缓冲区中,直到第一个连接关闭并且第二个客户端连接为止。
如果第二个客户端在连接存在之前发出READ
,则会挂起。当第二个客户端在队列中时,第三个客户端的任何连接尝试都会失败。
如果已经打开 TCP
设备的客户端在第一个连接仍然存在时尝试第二次连接,则第二个OPEN命令会导致错误。将这种情况视为错误而不是USE
命令可以防止出现意外的结果。如果错误的程序认为它已打开新连接,而实际上它正在重用可能具有不同目标或不同参数的现有连接,则可能会出现此类意外结果。
TCP
设备的作业命令
可以使用JOB
命令来实现TCP
并发服务器。 TCP
并发服务器允许同时为多个客户端提供服务。在这种模式下,客户端不必等待服务器完成为其他客户端提供服务。相反,每次客户端请求服务器时,它都会为该客户端生成一个单独的子作业,只要客户端需要它,该子作业就会保持打开状态。一旦生成该子作业(由JOB命令的返回指示),另一个客户端就可以请求服务,并且服务器也将为该客户端创建一个子作业。
非并发和并发模式下的客户端/服务器连接。
并发服务器使用JOB
命令并设置了切换并发服务器位(位 4
或位 16
)。位 16
是推荐设置。
- 如果设置了位
4
,则JOB命令将主要输入和主要输出进程参数中的TCP
设备传递给衍生进程。每当在switch
中包含位4
时,必须在主要输入和主要输出过程参数中指定TCP
设备。主输入和主输出必须使用相同的设备。不建议使用位4
;有关详细信息,请参阅《ObjectScript 参考》中的JOB
命令。 - 如果设置了位
16
,则JOB
命令将TCP
设备、主要输入和主要输出进程参数的三个独立设备传递给生成的进程。可以使用主体输入和主体输出进程参数在JOB
命令中指定其中两个TCP
设备。还可以默认这些参数,如以下示例所示:JOB
child:(:16:input:output)
或JOB child:(:16::))
。
在发出JOB
命令之前,为主要输入和主要输出指定的设备必须:
- 保持开放
- 监听
TCP
端口 - 已接受传入连接
在执行JOB
命令之后,生成过程中的设备仍在侦听 TCP
端口,但不再具有活动连接。应用程序应在发出JOB
命令后检查$ZA
,以确保 TCP
设备状态中的 CONNECTED
位已重置。
生成的进程使用指定的 TCP
设备在指定的入口点启动。TCP
设备在子进程中与在父进程中具有相同的名称。 TCP
设备有一个连接的套接字。继承的TCP
设备处于S
(流)模式。但是,子进程可以使用USE
命令更改模式。我们建议服务器以A(接受)模式打开TCP
设备。
- 当
switch =4
时,如果主设备上发生错误,作业只是停止,而不采取错误陷阱。这是因为当switch =4
时,TCP
设备是主要设备。要支持错误捕获,请使用switch =16
并为TCP
设备指定另一个设备。 - 当
switch =4
时,如果远程TCP
设备关闭连接,作业就会停止,而不会出现错误陷阱。要覆盖此默认行为并生成错误,必须设置%SYSTEM.Process
类的DisconnectErr()
方法。
可以使用%SYSTEM.Socket
类方法(而不是JOB
命令)来创建并发 TCP
服务器连接。但是,请注意, %SYSTEM.Socket
方法假定辅助作业已启动。如果不需要侦听器作业来启动辅助作业,并且侦听器作业知道辅助作业的进程 ID
(PID
),则可以使用这些方法进行并发 TCP
服务器连接。
在某些情况下,TCP
将单独的记录连接起来形成单个记录。如果客户端或服务器进程向 TCP
端口发出一系列由 WRITE
分隔的WRITE
命令,则可能会发生串联!
或WRITE
#命令来刷新缓冲区,无论连接的另一端是否正在等待READ
命令。
下面的第一个示例概述了进程 A
在进程 B
将两条记录写入 TCP
端口时等待READ命令时如何接收两条单独的记录。
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
第二个示例概述了进程 A
在进程 B
完成向 TCP
端口写入两条记录后发出READ
命令时如何接收一条串联记录。
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
多路复用 IRIS TCP
设备
%SYSTEM.Socket
在提供了多路复用 IRIS TCP
设备的方法。 Fork()
和Select()
方法允许使用单个作业同时处理接受新连接和从连接的 TCP
设备读取数据。监听的 TCP
设备收到连接后,使用Fork()
创建新的 TCP
设备用于读取数据。原始侦听 TCP
设备继续接受传入连接。可以使用Select()
方法来等待侦听和连接的 TCP
设备。当新连接到达或数据可用时, Select()
返回收到信号的设备名称。
可以使用Select()、 Publish()、 Export()
和Import()
方法来让侦听器作业接受传入连接并将连接的设备传递给工作人员作业。该工作人员作业可以与远程客户端进行通信。