HttpURLConnection的使用(网络通信)

HttpURLConnection的使用(网络通信)
URLConnection类给应用程序和web资源之间架设起了通信的桥梁,
这些web资源通常是通过url来标记的,本文将讲述如何使用HttpURLConnection来访问web页面(发送数据流)和读取数据流。
案例:连个servlet的通信:
1、客户端的发送和接受数据:
HttpURLConnection +
URL+
OutputStream(写入数据)—-通过httpurlconnection获取+
InputStream(读取数据))—-通过httpurlconnection获取

package com;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
public class IOServlet extends HttpServlet
{
    /**
     * 对于主动请求其它接口的参数流写入(POST方式)
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException
    {
        System.out.println("begin send");  //=================================1
        String inputParam = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><page><username>爱心天使</usernaem><age>26</age></page>";

        URL url = null;
        HttpURLConnection httpConn = null;
        OutputStream output = null;
        OutputStreamWriter outr = null;

        url = new URL("http://127.0.0.1:8888/iotest/ReadServlet");
        httpConn = (HttpURLConnection) url.openConnection();
        HttpURLConnection.setFollowRedirects(true);
        httpConn.setDoOutput(true);
        httpConn.setRequestMethod("POST");
        httpConn.setRequestProperty("Content-Type", "text/xml");
        httpConn.connect();
        output = httpConn.getOutputStream();
        outr = new OutputStreamWriter(output);
        // 写入请求参数
        outr.write(inputParam.toString().toCharArray(), 0, inputParam
                .toString().length());
        outr.flush();
        outr.close();
        System.out.println("send ok");  //============================2
        int code = httpConn.getResponseCode();
        System.out.println("code " + code);   //==============================6  200
        System.out.println(httpConn.getResponseMessage());   //==============7 OK

        //读取响应内容
        String sCurrentLine = ""; 
        String sTotalString = ""; 
        if (code == 200)
        {
            java.io.InputStream is = httpConn.getInputStream();
            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(is));
            while ((sCurrentLine = reader.readLine()) != null)
                if (sCurrentLine.length() > 0)
                    sTotalString = sTotalString + sCurrentLine.trim();
        } else
        {
            sTotalString = "远程服务器连接失败,错误代码:" + code;

        }
        System.out.println("response:" + sTotalString);   //===============8  response:您已经请求成功,这是响应数据!

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException
    {
        this.doGet(request, response);
    }

}

2、服务器的接受和回应数据:
ServletInputStream(request中获取)–读取数据
PrintWriter(response中获取)—–相应数据

package com;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
public class ReadServlet extends HttpServlet
{

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException
    {
        System.out.println("begin read");             //==========================================3
        ServletInputStream inStream = request.getInputStream(); // 取HTTP请求流
        int size = request.getContentLength(); // 取HTTP请求流长度
        byte[] buffer = new byte[size]; // 用于缓存每次读取的数据 
        byte[] in_b = new byte[size]; // 用于存放结果的数组
        int count = 0;
        int rbyte = 0;
        // 循环读取 
        while (count < size)
        { 
            rbyte = inStream.read(buffer); // 每次实际读取长度存于rbyte中 sflj
            for (int i = 0; i < rbyte; i++)
            {
                in_b[count + i] = buffer[i];
            }
            count += rbyte;
        }
        System.out.println("result:" + new String(in_b,0,in_b.length));  //===============================4
                                                      //result:<?xml version="1.0" encoding="UTF-8"?><page><username>爱心天使</usernaem><age>26</age></page>

        response.setContentType("text/html");
        //注意响应中文数据时要设置
        response.setCharacterEncoding("GBK");
        PrintWriter out = response.getWriter();
        //回与响应数据
        out.write("您已经请求成功,这是响应数据!");  //================================5
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException
    {
        this.doGet(request, response);
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值