#01.使用socket发送HTTP GET请求
##1.HTTP协议介绍 HTTP是建立在TCP/IP之上,用于互联网上超媒体系统应用之间的通信协议。中文奶名:超文本传输协议。
简单地说,HTTP就是建立在TCP/IP之上,使用一些特殊的文本标志来进行客户端与服务器端的通信。
这些特殊的标志文本,包括三个部分:Start line,Header,Body。
客户端发送给服务器(Request请求)以及服务器返回给客户端(Response响应)的特殊标志文本不尽相同,例如Request与Response的 Start Line是不同的,Request与Response的Header有公用的部分,也有自己私有的Header。下面这张图是一个HTTP GET Request以及服务 器的Response。
需要注意都是,GET请求没有Body。
##2.HTTP GET请求 如上面所说,HTTP是建立在TCP/IP之上使用一些标识文本来进行通信的协议,只要我们按照一定的格式发送这些标识文本,就可以跟 HTTP服务器进行通讯了。例如下面是一个HTTP GET请求的标识文本:
GET /index.html HTTP/1.1<!--回车换行符-->
Host: www.allwinnertech.com<!--回车换行符-->
<!--回车换行符-->
上面这个,基本是HTTP GET请求所需的最少的标识文本,只包括Start line和一个Header属性(GET请求没有Body)。
第一行为Start line,这里表示是一个基于HTTP 1.1版本的GET请求,需要获取的资源为Host所标识的服务器下的index.html文本。
第二行到回车换行符行(这里是第三行)前都是Header,Header的Host属性表明访问的域名为www.allwinnertech.com。
这里的第三行为一个回车换行符,用于标识Header与Body的界线,由于GET请求没有Body,所以这里的最后一行为回车换行符。
我们只要在TCP连接之上,按照这个格式发送文本,就可以取得www.allwinnertech.co/index.html这个文本了。
##3.使用Socket发送HTTP GET请求 这里尽量使用最少的代码量来实现HTTP GET请求,不会考虑长连接(一次TCP连接,多次HTTP请求),以及WebSocket(一次Request, 多次Reponse)等请求。这里只是发送一次HTTP请求,然后读取取得的文本(更像HTTP 1.0)。
Socket socket = new Socket("www.allwinnertech.com", 80); // 建立socket连接
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); // 取得文本输出流
bw.write("GET / HTTP/1.1\r\n"); // \r\n为回车换行符
bw.write("Host: www.allwinnertech.com\r\n");
bw.write("\r\n"); // 不要忘记Header之后还有一个回车换行符
bw.flush(); // 发送请求
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); // 取得文本输出流
String line = null;
while((line = br.readLine())!=null) { //迭代输出的文本
System.out.println(line);
}
将这段代码运行之后,就可以在控制台看到取得文本了。
就那么简单!