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

来源:互联网 发布:软件项目总结 编辑:程序博客网 时间:2024/05/22 14:55

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