• urlconnection用法(转)


    1.获取ip地址

    package demo.net;

     

    import java.net.InetAddress;

    import java.net.UnknownHostException;

     

    /*

     * 获取指定IP的主机名

     */

    public class IPScanner {

     

    // 传入IP地址,返回主机名称,若主机不可达则返回ip地址的字符串形式

    public static String scanner(byte[] ip) {

    InetAddress addr = null;

    try {

    addr = InetAddress.getByAddress(ip);

    catch (UnknownHostException e) {

    e.printStackTrace();

    }

    return addr.getHostName();

    }

     

    public static void main(String[] args) {

    String hostName;

    String ip;

    for (int i = 0; i <= 127; i++) {

    ip = "59.68.255." + i;

    hostName = scanner(new byte[] { 59, 68, (byte) 255, (byte)i });

    if (!ip.equals(hostName))

    System.out.println(ip +" : "+hostName);

    }

    }

    }

     

     2.获取html文本

    package demo.net;

     

    import java.io.IOException;

    import java.net.URL;

    import java.util.Scanner;

     

    /*

     * URL类用法示例,URL是统一资源定位符,可以打开到达一个资源的流,从而获取资源的内容

     * 示例中获取武汉工业学院首页的内容,返回的内容是html文本

     */

    public class URLDemo {

    public static void main(String[] args) {

    try {

    URL url = new URL("http://www.whpu.edu.cn");

    Scanner in = new Scanner(url.openStream());

    while (in.hasNextLine())

    System.out.println(in.nextLine());

    } catch (IOException e) {

    e.printStackTrace();

    }

    }

    }

    3.获取html文本

    package demo.net;

     

    import java.io.IOException;

    import java.net.URL;

    import java.net.URLConnection;

    import java.util.Scanner;

     

    /*

     * URLConnection类是一个抽象类,定位到资源后可以读取资源内容且获得头信息

     * 同时也可以用来提交表单数据,此示例展示获取资源及头信息

     */

    public class URLConnectionDemo {

    public static void main(String[] args) {

    try {

    // 1、通过在 URL 上调用 openConnection 方法创建连接对象。

    URL url = new URL("http://www.whpu.edu.cn");

    URLConnection connection = url.openConnection();

    // 2、处理设置参数和一般请求属性。

    connection.setDoInput(true);

    connection.setDoOutput(true);

    // 3、使用 connect 方法建立到远程对象的实际连接。

    connection.connect();

    // 4、远程对象变为可用。远程对象的头字段和内容变为可访问。

    System.out.println(connection.getContentType());

    System.out.println(connection.getContentEncoding());

    System.out.println(connection.getContentLength());

    System.out.println(connection.getDate());

    // 读取内容

    Scanner in = new Scanner(connection.getInputStream());

    while (in.hasNextLine())

    System.out.println(in.nextLine());

     

    } catch (IOException e) {

    e.printStackTrace();

    }

    }

    }

    4.总结

    a:) HttpURLConnection的connect()函数,实际上只是建立了一个与服务器的tcp连接,并没有实际发送http请求。无论是post还是get,http请求实际上直到HttpURLConnection的getInputStream()这个函数里面才正式发送出去。

    b:) 在用POST方式发送URL请求时,URL请求参数的设定顺序是重中之重,对connection对象的一切配置(那一堆set函数)都必须要在connect()函数执行之前完成。而对outputStream的写操作,又必须要在inputStream的读操作之前。这些顺序实际上是由http请求的格式决定的。如果inputStream读操作在outputStream的写操作之前,会抛出异常:java.net.ProtocolException: Cannot write output after reading input.......

    c:) http请求实际上由两部分组成,一个是http头,所有关于此次http请求的配置都在http头里面定义,一个是正文content。connect()函数会根据HttpURLConnection对象的配置值生成http头部信息,因此在调用connect函数之前,就必须把所有的配置准备好。

    d:) 在http头后面紧跟着的是http请求的正文,正文的内容是通过outputStream流写入的,实际上outputStream不是一个网络流,充其量是个字符串流,往里面写入的东西不会立即发送到网络,而是存在于内存缓冲区中,待outputStream流关闭时,根据输入的内容生成http正文。至此,http请求的东西已经全部准备就绪。在getInputStream()函数调用的时候,就会把准备好的http请求正式发送到服务器了,然后返回一个输入流,用于读取服务器对于此次http请求的返回信息。由于http请求在getInputStream的时候已经发送出去了(包括http头和正文),因此在getInputStream()函数之后对connection对象进行设置(对http头的信息进行修改)或者写入outputStream(对正文进行修改)都是没有意义的了,执行这些操作会导致异常的发生。

     

    更详细的URLConnection类解析内容请参考:http://www.blogjava.net/supercrsky/articles/247449.html

  • 相关阅读:
    VS 2008 和 .NET 3.5 Beta 2 发布了
    搭建.NET 3.0环境
    Expression Studio和Silverlight学习资源、安装问题汇总
    Discuz! NT官方社区
    VS2005中ajax安装指南[转]
    IT人 不要一辈子靠技术生存(转)
    Discuz!NT2.5发布 正式版同步开源
    VS2005下开发Silverlight 1.1翻译加补充
    自动化测试案例
    [原]JavaScript必备知识系列开篇
  • 原文地址:https://www.cnblogs.com/sm21312/p/3909835.html
Copyright © 2020-2023  润新知