第二十七章 TCP 客户端 服务器通信 - 连接管理
文章目录
- 第二十七章 TCP 客户端 服务器通信 - 连接管理
- 连接管理
- TCP 设备的作业命令
- 非并发和并发模式下的客户端/服务器连接。
第二十七章 TCP 客户端 服务器通信 - 连接管理
连接管理
服务器一次只维护一个连接。如果第二个客户端在另一个连接打开时尝试连接,则 TCP/IP
将该客户端放入队列中。在队列中时,第二个客户端可以像已连接一样写入端口。第二个客户端写入的数据保留在缓冲区中,直到第一个连接关闭并且第二个客户端连接。
如果第二个客户端在连接存在之前发出 READ
,它就会挂起。当第二个客户端在队列中时,第三个客户端的任何连接尝试都会失败。
如果已经打开 TCP
设备的客户端在第一个连接仍然存在时尝试第二次连接,则第二个 OPEN
命令会导致<COMMAND>
错误。将这种情况视为错误而不是 USE
命令可以防止出现意外结果。如果一个错误的程序认为它打开了一个新连接,而实际上它正在重用一个可能具有不同目标或不同参数的现有连接,则可能会出现这种意想不到的结果。
TCP 设备的作业命令
可以使用 JOB
命令来实现 TCP
并发服务器。 TCP
并发服务器允许同时为多个客户端提供服务。在这种模式下,客户端不必等待服务器完成对其他客户端的服务。相反,每次客户端请求服务器时,它都会为该客户端生成一个单独的子作业,只要客户端需要它,该子作业就会保持打开状态。一旦生成此子作业(由 JOB
命令的返回指示),另一个客户端可能会请求服务,服务器也会为该客户端创建一个子作业。
非并发和并发模式下的客户端/服务器连接。
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
并发服务器使用设置了切换并发服务器位(第 4
位或第 16
位)的 JOB
命令。位 16
是推荐设置。
如果设置了第 4
位,则 JOB
命令将主要输入和主要输出进程参数中的 TCP
设备传递给派生进程。无论何时在开关中包含位 4
,都必须在主要输入和主要输出过程参数中指定 TCP
设备。必须对主要输入和主要输出使用相同的设备。不推荐使用位 4
。
如果设置了第 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
设备。
派生进程中的 TCP
设备处于连接状态:与设备从客户端打开后接收到的状态相同。生成的进程可以使用带有 USE 0
或 USE $P
的 TCP
设备。它还可以隐式使用 TCP
设备(如果 switch=4
)。但是,出于以下原因,switch=16
优于 switch=4
:
- 当
switch=4
时,如果在主设备上发生<READ>
错误,则作业会简单地停止,而不会出现错误陷阱。这是因为当switch=4
时,TCP
设备是主要设备。要支持错误捕获,请使用switch=16
并为TCP
设备指定另一个设备。 - 当
switch=4
时,如果远程TCP
设备关闭连接,作业会简单地停止,而不会出现错误陷阱。要覆盖此默认行为并生成<DSCON>
错误,必须在类中设置%SYSTEM.Process
的DisconnectErr()
方法。
可以在类方法中使用 %SYSTEM.Socket
而不是 JOB
命令来创建并发 TCP
服务器连接。但是,请注意方法中的 %SYSTEM.Socket
假定工作作业已经启动。如果不需要侦听器作业来启动辅助作业,并且侦听器作业知道辅助作业的进程 ID (PID)
,则可以将这些方法用于并发 `TCP 服务器连接。