第二十七章 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 0USE $PTCP 设备。它还可以隐式使用 TCP 设备(如果 switch=4)。但是,出于以下原因,switch=16 优于 switch=4

  • switch=4 时,如果在主设备上发生 <READ> 错误,则作业会简单地停止,而不会出现错误陷阱。这是因为当 switch=4 时,TCP 设备是主要设备。要支持错误捕获,请使用 switch=16并为 TCP 设备指定另一个设备。
  • switch=4 时,如果远程 TCP 设备关闭连接,作业会简单地停止,而不会出现错误陷阱。要覆盖此默认行为并生成 <DSCON> 错误,必须在类中设置 %SYSTEM.ProcessDisconnectErr()方法。

可以在类方法中使用 %SYSTEM.Socket而不是 JOB 命令来创建并发 TCP 服务器连接。但是,请注意方法中的 %SYSTEM.Socket 假定工作作业已经启动。如果不需要侦听器作业来启动辅助作业,并且侦听器作业知道辅助作业的进程 ID (PID),则可以将这些方法用于并发 `TCP 服务器连接。

11-22 21:08