例如, 我们需要实现一个服务器版的加法器. 我们需要客户端把要计算的两个加数发过去, 然后由服务器进行计算, 最后再把结果返回给客户端.
约定方案一: 客户端发送一个形如"1+1"的字符串; 这个字符串中有两个操作数, 都是整形; 两个数字之间会有一个字符是运算符, 运算符只能是 + ; 数字和运算符之间没有空格;
约定方案二: 定义结构体来表示我们需要交互的信息; 发送数据时将这个结构体按照一个规则转换成字符串, 接收到数据的时候再按照相同的规则把字符串转化回结构体; 这个过程叫做 “序列化” 和 “反序列化”
// proto.h 定义通信的结构体 typedef struct Request { int a; int b; } Request; typedef struct Response { int sum; } Response; // client.c 客户端核心代码 Request request; Response response; scanf("%d,%d", &request.a, &request.b); write(fd, request, sizeof(Request)); read(fd, response, sizeof(Response)); // server.c 服务端核心代码 Request request; read(client_fd, &request, sizeof(request)); Response response; response.sum = request.a + request.b; write(client_fd, &response, sizeof(response));无论我们采用方案一, 还是方案二, 还是其他的方案, 只要保证, 一端发送时构造的数据, 在另一端能够正确的进行解析, 就是ok的. 这种约定, 就是 应用层协议