最近本人毕业设计涉及到C51单片机发送HTTP给服务器,因此学习了HTTP协议的发送和接收。这里不是使用Http client之类封装好的操作,而是手动模拟。
HTTP协议位于应用层运行在TCP/IP之上,所以可以使用Socket建立TCP/IP链接之后,直接发送数据模拟HTTP协议。
Socket的知识请看
Java—Socket编程UDP/TCP
http://blog.csdn.net/xn4545945/article/details/8098646
关于HTTP协议请看
Java与Http协议
http://www.cnblogs.com/devinzhang/archive/2012/02/06/2340186.html
七层网络模型请看
OSI七层模型详解
http://blog.csdn.net/yaopeng_2005/article/details/7064869
不再赘述。
JAVA中有TCP/IP通道的Socket和基于UDP的DatagramSocket ,我们需要使用TCP/IP协议的Socket。
本文以请求百度首页www.baidu.com为例,首先与百度的服务器建立TCP/IP链接,端口号是网页服务器默认的80。
之后我们发送最简短请求,只留下两行,其实两行数据只要第一行GET也能请求成功。
GET http://www.baidu.com/ HTTP/1.1
Host: www.baidu.com
<-空行
<-空行
这四行写在代码里面是
"GET http://www.baidu.com/ HTTP/1.1\r\nHost: www.baidu.com\r\n\r\n"
- ‘\r’是回车,’\n’是换行。\r\n连在一起就能完成我们文本编辑下的换行功能,即回车键。
- 输入完最后两行空行,服务器才会判断你的请求已经输入完毕,否则服务器还在等待请求输入。
- 请求完之后,服务器便会返回结果。
JAVA代码
package com.example.http;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class FakeHttp1 {
private final String URL = “www.baidu.com”;
private final String CONTENT = “GET http://www.baidu.com/ HTTP/1.1\r\nHost: www.baidu.com\r\n\r\n” ;
private final int PORT = 80 ;
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">sendHTTP</span>(){
<span class="hljs-keyword">try</span> {
Socket socket = <span class="hljs-keyword">new</span> Socket(URL,PORT); <span class="hljs-comment">//建立TCP/IP链接</span>
OutputStream out = socket.getOutputStream() ;
BufferedReader in = <span class="hljs-keyword">new</span> BufferedReader(<span class="hljs-keyword">new</span> InputStreamReader(socket.getInputStream(),<span class="hljs-string">"UTF-8"</span>));
out.write(CONTENT.getBytes()); <span class="hljs-comment">//发送数据</span>
<span class="hljs-keyword">int</span> d = -<span class="hljs-number">1</span> ;
<span class="hljs-keyword">while</span>((d=in.read())!=-<span class="hljs-number">1</span>){ <span class="hljs-comment">//接收</span>
System.out.print((<span class="hljs-keyword">char</span>)d); <span class="hljs-comment">//输出到控制台</span>
}
} <span class="hljs-keyword">catch</span> (UnknownHostException e) {
<span class="hljs-comment">// TODO Auto-generated catch block</span>
e.printStackTrace();
} <span class="hljs-keyword">catch</span> (IOException e) {
<span class="hljs-comment">// TODO Auto-generated catch block</span>
e.printStackTrace();
}
}
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span>(String[] args){
<span class="hljs-keyword">new</span> FakeHttp1().sendHTTP();
}
}