二进制协议与文本协议实际上并不是关于二进制Blob的编码方式。真正的区别在于协议是围绕数据结构还是围绕文本字符串。让我举一个例子:HTTP。HTTP是一种文本协议,即使当它发送jpeg图像时,它只是发送原始字节,而不是它们的文本编码。
但是使HTTP成为文本协议的原因是,获取jpg的交换如下所示:
请求:
GET /files/image.jpg HTTP/1.0
Connection: Keep-Alive
User-Agent: Mozilla/4.01 [en] (Win95; I)
Host: hal.etc.com.au
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
Accept-Language: en
Accept-Charset: iso-8859-1,*,utf-8
响应:
HTTP/1.1 200 OK
Date: Mon, 19 Jan 1998 03:52:51 GMT
Server: Apache/1.2.4
Last-Modified: Wed, 08 Oct 1997 04:15:24 GMT
ETag: "61a85-17c3-343b08dc"
Content-Length: 60830
Accept-Ranges: bytes
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: image/jpeg
<binary data goes here>
请注意,可以很容易地将其更紧密地打包到一个看起来像C的结构中
请求:
struct request {
int requestType;
int protocolVersion;
char path[1024];
char user_agent[1024];
char host[1024];
long int accept_bitmask;
long int language_bitmask;
long int charset_bitmask;
};
响应:
struct response {
int responseType;
int protocolVersion;
time_t date;
char host[1024];
time_t modification_date;
char etag[1024];
size_t content_length;
int keepalive_timeout;
int keepalive_max;
int connection_type;
char content_type[1024];
char data[];
};
其中,根本不需要传输字段名称,例如,responseType
响应结构中的int是一个值为200的int而不是三个字符“ 2”,“ 0”,“ 0”。这就是基于文本的协议:被设计为以一排(通常是人类可读的)文本行而不是许多不同类型的结构化数据进行通信的协议。