二进制协议与文本协议并不是关于如何编码二进制数据。真正的区别在于协议是围绕着数据结构还是文本字符串。让我举个例子: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
是一个值为200的整数,而不是三个字符'2''0''0'。这就是文本协议:它被设计成作为通信的一种平面文本流(通常是可读的行),而不是许多不同类型的结构化数据。