当前位置: 首页 > article >正文

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


http://www.kler.cn/a/405021.html

相关文章:

  • Vue2与Vue3:深入比较与迁移指南
  • SAP PI/PO Proxy2JDBC SQL_QUERY动态接口示例
  • XLNet——打破 BERT 局限的预训练语言模型
  • python基本数据类型 -- 元组tuple
  • 深入理解Spring(二)
  • Bug:gomonkey系列问题(undefined: buildJmpDirective)
  • 基于uniapp开发的微信H5图片上传压缩
  • 2024.6使用 UMLS 集成的基于 CNN 的文本索引增强医学图像检索
  • 为正在运行的 Docker 容器重启策略,以提高服务的可用性
  • Django:从入门到精通
  • squeeze()
  • Applied Intelligence投稿
  • 大数据-230 离线数仓 - ODS层的构建 Hive处理 UDF 与 SerDe 处理 与 当前总结
  • Leetcode:栈和队列的互相实现
  • Vue 中的透传,插槽,依赖注入
  • Linux-服务器辨别实体机OR虚拟机
  • 使用ENSP实现DHCP+动态路由
  • 逆向攻防世界CTF系列40-ReverseMe-120
  • 【Mac】安装 Python3
  • SpringMVC案例学习(二)--表白墙/图书管理系统1.0版本
  • 基于web的教务系统的实现(springboot框架 mysql jpa freemarker)
  • 小程序-使用 iconfont 图标库报错:Failed to load font
  • React的hook✅
  • CSV文件数据导入hive
  • 开发中使用UML的流程_02 CIM-1:定义业务流程
  • Docker 安装单机版mysql 并持久化数据