5.1 回声客户端的完美实现
前面提到,服务器希望通过调用1次write函数传输数据,但如果数据太大,操作系统可能把数据分成多个数据包发送到客户端 ,而之前的回声客户端是这么写的
你可以清楚的看到,客户端传输的是字符串,而且是通过write一次性发送的。之后还调用一次read,期待接收自己传输的字符串
而实际的情况是,在此过程中,客户端有可能在尚未接收到全部的数据包时就调用了read函数。
Q:既然回声客户端会收到所有字符串数据,是否只需要多等一会?过一段时间再调用read来一次性读取所有字符串数据?
A:的确可以,但要等多久?10分钟你能接受吗?显然不能,我们肯定希望在收到字符串数据时立刻读取并输出。
回声客户端问题解决方法
其实很容易解决,可以提前确定接收数据的大小
若之前传输了20字节长的字符串,则在接收时循环调用read函数读取20个字节即可
计算器服务器端/客户端示例
1)写程序之前,定义如下应用层协议
-①客户端连接到服务器端后以1字节整数形式传递待算数字的个数
-②客户端向服务器端传递的每个整型数据占用4个字节
-③传递整型数据后接着传递运算符,运算符信息占用1个字节
-④选择字符+、-、*之一去传递
-⑤服务器端以4个字节整型数向客户端传回运算结果
-⑥客户端得到运算结果后终止与服务器端的连接
程序分析
1)服务器端
2)客户端