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

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

}





  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值