第二十九章 TCP 客户端 服务器通信 - 记录的拼接
记录的拼接
在某些情况下,TCP
会将不同的记录连接在一起形成单个记录。如果客户端或服务器进程向一个由WRITE
分隔的TCP
端口发出一系列WRITE
命令,则可能会发生串接!或用于刷新缓冲区的WRITE#
命令,而不管读命令是否在连接的另一端等待。
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
第二个例子概述了在进程B完成将两条记录写入到TCP
端口之后,当它发出读命令时,进程A
如何接收一条串联的记录。
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
多路复用 TCP
设备
类中的%SYSTEM.Socket
提供了多路传输 TCP
设备的方法。Fork()
和Select()
方法允许让单个作业同时处理接受新连接和从连接的TCP设备读取数据。侦听的TCP
设备收到连接后,在中使用Fork()
打开以创建用于读取数据的新的TCP
设备。原始侦听的TCP
设备继续接受传入的连接。可以使用在的Select()
来等待侦听和连接的TCP
设备。当新连接到达或数据可用时,Select()
将返回发出信号的设备名称。
可以使用Select()
、Publish()
、Export()
和Import()
方法,使侦听器作业接受传入连接并将连接的设备传递给工作作业。此工作作业可以与远程客户端通信。
正在关闭连接
客户端或服务器端都可以结束TCP绑定连接。关闭连接的首选方法是客户端向TCP
设备发出close
命令。(或者,客户端可以发出HALT
命令。)然后服务器应该向该设备发出另一个READ
命令,并接收到<READ>
错误,然后为TCP
设备发出一个CLOSE
命令。
这种顺序的原因是,根据TCP/IP
标准,连接资源在CLOSE
后保持两分钟,但仅用于“主动关闭器”——首先执行CLOSE
的进程。因此,最好先关闭客户机,因为服务器的资源通常比客户机的资源更有限。
使用CLOSE
命令断开连接
从客户端或服务器发出这样的CLOSE
命令:
CLOSE "|TCP|devicenum"
如上所述,客户端最好先发出CLOSE
命令。如果服务器首先发出CLOSE
命令,客户端将收到<WRITE>
错误,然后应该发出CLOSE
命令。