第二十七章 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 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 服务器连接。

相关推荐
我曾经是个程序员24 分钟前
鸿蒙学习记录之http网络请求
服务器·学习·http
0zxm26 分钟前
06 - Django 视图view
网络·后端·python·django
真真-真真1 小时前
WebXR
linux·运维·服务器
୧⍢⃝୨ LonelyCoder1 小时前
FreePBX修改IP地址和端口以及添加SSL证书开启HTTPS访问
tcp/ip·https·ssl
轩辰~1 小时前
网络协议入门
linux·服务器·开发语言·网络·arm开发·c++·网络协议
燕雀安知鸿鹄之志哉.2 小时前
攻防世界 web ics-06
网络·经验分享·安全·web安全·网络安全
wanhengidc2 小时前
短视频运营行业该如何选择服务器?
运维·服务器
ProcessOn官方账号2 小时前
如何绘制网络拓扑图?附详细分类解说和用户案例!
网络·职场和发展·流程图·拓扑学
s_yellowfish2 小时前
Linux服务器pm2 运行chatgpt-on-wechat,搭建微信群ai机器人
linux·服务器·chatgpt
vvw&3 小时前
如何在 Ubuntu 22.04 上安装 Ansible 教程
linux·运维·服务器·ubuntu·开源·ansible·devops