我们知道TCP是全双工的,可以同时进行发收,因为他有一个发送缓冲区和一个接收缓冲区
我们使用write其实是把数据拷贝到发送缓冲区,使用read接收缓冲区的数据,其实是把数据拷贝到文件缓冲区里,发送的过程中,我们怎么保证发送的是完整的数据?接收的是完整的数据呢?
那就需要协议了,协议是种约定,我们双方客户端和服务器约定好的。socket api的接口, 在读写数据时, 都是按 "字符串" 的方式来发送接收的. 如果我们要传输一些"结构化的数据" 怎么办呢?我们一般是不发送结构体的数据的,因为在跨平台环境下,结构体的大小都会有所不同,所以我们一般把结构体的数据进行序列化,把它变成字符串,对方接收数据在进行反序列化变回结构体
序列化:结构体 ==> 字符串
反序列化:字符串 ==> 结构体
网络版本计数器
协议定制
例如, 我们需要实现一个服务器版的计算器. 我们需要客户端把要计算的两个数据发过去, 然后由服务器进行计算, 最后再把结果返回给客户端.
约定方案:
- 定义结构体来表示我们需要交互的信息
- 发送数据时将这个结构体按照一个规则转换成字符串, 接收到数据的时候再按照相同的规则把字符串转化回结构体,这个过程叫做序列化和反序列化
- 客户端发送序列化为"x + y"的正文字符串
- 这个字符串中有两个操作数, 都是整形
- 数字和运算符之间有空格
- 添加报头和报尾来区分不同的正文字符串
- “len”\n"x + y"\n,len表示正文字符串的长度,\n是为了分割和打印的
- 客户端就这样“len”\n"x + y"\n发送数据
- 服务器把计算结果和错误码发送回来,服务器发送序列化为"result code"的正文字符串
- 同理添加报头和报尾,变成"len"\n"result code"的字