最近本人毕业设计涉及到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 ;
public void sendHTTP(){
try {
Socket socket = new Socket(URL,PORT); //建立TCP/IP链接
OutputStream out = socket.getOutputStream() ;
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));
out.write(CONTENT.getBytes()); //发送数据
int d = -1 ;
while((d=in.read())!=-1){ //接收
System.out.print((char)d); //输出到控制台
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args){
new FakeHttp1().sendHTTP();
}
}