5.1 回声客户端的完美实现

前面提到,服务器希望通过调用1次write函数传输数据,但如果数据太大,操作系统可能把数据分成多个数据包发送到客户端 ,而之前的回声客户端是这么写的网络编程——5. 基于TCP的服务器端/客户端(2)
你可以清楚的看到,客户端传输的是字符串,而且是通过write一次性发送的。之后还调用一次read,期待接收自己传输的字符串
实际的情况是,在此过程中,客户端有可能在尚未接收到全部的数据包时就调用了read函数
Q:既然回声客户端会收到所有字符串数据,是否只需要多等一会过一段时间再调用read来一次性读取所有字符串数据?
A:的确可以,但要等多久?10分钟你能接受吗?显然不能,我们肯定希望在收到字符串数据时立刻读取并输出。

回声客户端问题解决方法

其实很容易解决,可以提前确定接收数据的大小

若之前传输了20字节长的字符串,则在接收时循环调用read函数读取20个字节即可
网络编程——5. 基于TCP的服务器端/客户端(2)

计算器服务器端/客户端示例

1)写程序之前,定义如下应用层协议
-①客户端连接到服务器端后以1字节整数形式传递待算数字的个数
-②客户端向服务器端传递的每个整型数据占用4个字节
-③传递整型数据后接着传递运算符,运算符信息占用1个字节
-④选择字符+、-、*之一去传递
网络编程——5. 基于TCP的服务器端/客户端(2)
-⑤服务器端以4个字节整型数向客户端传回运算结果
-⑥客户端得到运算结果后终止与服务器端的连接

程序分析

1)服务器端

网络编程——5. 基于TCP的服务器端/客户端(2)
网络编程——5. 基于TCP的服务器端/客户端(2)

2)客户端

网络编程——5. 基于TCP的服务器端/客户端(2)
网络编程——5. 基于TCP的服务器端/客户端(2)

相关文章: