java网络编程四:InetAddress类、URL类、URLConnection类解析及用法示例

1、InetAddress类实现简单IP扫描获得主机名

  1. <span style="font-size:16px;">package demo.net;  
  2.   
  3. import java.net.InetAddress;  
  4. import java.net.UnknownHostException;  
  5.   
  6. /* 
  7.  * 获取指定IP的主机名 
  8.  */  
  9. public class IPScanner {  
  10.   
  11.     // 传入IP地址,返回主机名称,若主机不可达则返回ip地址的字符串形式  
  12.     public static String scanner(byte[] ip) {  
  13.         InetAddress addr = null;  
  14.         try {  
  15.             addr = InetAddress.getByAddress(ip);  
  16.         } catch (UnknownHostException e) {  
  17.             e.printStackTrace();  
  18.         }  
  19.         return addr.getHostName();  
  20.     }  
  21.   
  22.     public static void main(String[] args) {  
  23.         String hostName;  
  24.         String ip;  
  25.         for (int i = 0; i <= 127; i++) {  
  26.             ip = "59.68.255." + i;  
  27.             hostName = scanner(new byte[] { 5968, (byte255, (byte)i });  
  28.             if (!ip.equals(hostName))  
  29.                 System.out.println(ip +" : "+hostName);  
  30.         }  
  31.     }  
  32. }  
  33. </span>  


 

2、URL示例

  1. <span style="font-size:16px;">package demo.net;  
  2.   
  3. import java.io.IOException;  
  4. import java.net.URL;  
  5. import java.util.Scanner;  
  6.   
  7. /* 
  8.  * URL类用法示例,URL是统一资源定位符,可以打开到达一个资源的流,从而获取资源的内容 
  9.  * 示例中获取武汉工业学院首页的内容,返回的内容是html文本 
  10.  */  
  11. public class URLDemo {  
  12.     public static void main(String[] args) {  
  13.         try {  
  14.             URL url = new URL("http://www.whpu.edu.cn");  
  15.             Scanner in = new Scanner(url.openStream());  
  16.             while (in.hasNextLine())  
  17.                 System.out.println(in.nextLine());  
  18.         } catch (IOException e) {  
  19.             e.printStackTrace();  
  20.         }  
  21.     }  
  22. }  
  23. </span>  


运行结果:输出html页面源码

 

3、URLConnection类示例

  1. <span style="font-size:16px;">package demo.net;  
  2.   
  3. import java.io.IOException;  
  4. import java.net.URL;  
  5. import java.net.URLConnection;  
  6. import java.util.Scanner;  
  7.   
  8. /* 
  9.  * URLConnection类是一个抽象类,定位到资源后可以读取资源内容且获得头信息 
  10.  * 同时也可以用来提交表单数据,此示例展示获取资源及头信息 
  11.  */  
  12. public class URLConnectionDemo {  
  13.     public static void main(String[] args) {  
  14.         try {  
  15.             // 1、通过在 URL 上调用 openConnection 方法创建连接对象。  
  16.             URL url = new URL("http://www.whpu.edu.cn");  
  17.             URLConnection connection = url.openConnection();  
  18.             // 2、处理设置参数和一般请求属性。  
  19.             connection.setDoInput(true);  
  20.             connection.setDoOutput(true);  
  21.             // 3、使用 connect 方法建立到远程对象的实际连接。  
  22.             connection.connect();  
  23.             // 4、远程对象变为可用。远程对象的头字段和内容变为可访问。  
  24.             System.out.println(connection.getContentType());  
  25.             System.out.println(connection.getContentEncoding());  
  26.             System.out.println(connection.getContentLength());  
  27.             System.out.println(connection.getDate());  
  28.             // 读取内容  
  29.             Scanner in = new Scanner(connection.getInputStream());  
  30.             while (in.hasNextLine())  
  31.                 System.out.println(in.nextLine());  
  32.   
  33.         } catch (IOException e) {  
  34.             e.printStackTrace();  
  35.         }  
  36.     }  
  37. }</span>  

运行结果:输出一些报头信息及html页面源码


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://blog.csdn.net/qq_29663071/article/details/51820077

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值