使用Socket发送接收HTTP请求(JAVA)

时间:2021-04-06 21:10:11

最近本人毕业设计涉及到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();
}
}