本文主要介绍java.net下为网络编程提供的一些基础包,InetAddress代表一个IP协议对象,可以用来获取IP地址,Host name之类的信息。URL和URLConnect可以用来访问web资源,URLDecode和URLEncode用来转换字符串。 本文会写两个例子来演示java网络编程的一些基本用法。

第一个例子,用java实现http get 和 post请求

本例涉及如下知识点,

  • HTT协议规范
  • 使用URL对象建立HTTP协议的网络连接URLConnection对象conn,本地和网络通信就靠这个对象的getInputStreamgetOutputStream方法
  • conn返回的inputStream和outputStream都是字节流(byte stream)
  • JAVA IO中的BufferedReader,属于reader族,是可以缓存的字符流(characters stream),是更直观的读取方式。
  • JAVA IO中的InputStreamReader,也属于reader族,是字节流这字符流的桥梁。 本例中使用它把网络读取的inputStream转换成了BufferedReader。
  • 注意在转换字节流到字符流的过程中,需要参考数据源进行编码转换,本例使用utf-8编码

具体实现代码如下, 本例参考了博客 http://www.cnblogs.com/zhuawang/archive/2012/12/08/2809380.html (谢谢, 已对编码部分优化)

 1 package network;
 2 
 3 import java.io.BufferedReader;
 4 import java.io.InputStreamReader;
 5 import java.io.PrintWriter;
 6 import java.net.URL;
 7 import java.net.URLConnection;
 8 import java.nio.charset.Charset;
 9 import java.util.List;
10 import java.util.Map;
11 
12 public class HttpRestTest {
13 
14     public static String sendGet(String url, String param) {
15         String result = "";
16         BufferedReader in  = null;
17         try {
18             String urlNameString = url + "?" + param;
19             URL resultUrl = new URL(urlNameString);
20             URLConnection connection = resultUrl.openConnection();
21             //设置通用属性
22             connection.setRequestProperty("accept", "*/");
23             connection.setRequestProperty("connection", "Keep-Alive");
24             connection.connect();
25             //获取响应头
26             Map<String, List<String>> map = connection.getHeaderFields();
27             
28             for(String key:map.keySet()) {
29                 System.out.println(key+"--->"+map.get(key));
30             }
31             Charset cs = Charset.forName("utf-8");
32             in = new BufferedReader(new InputStreamReader(connection.getInputStream(),cs));
33             String line;
34             while((line = in.readLine()) != null) {
35                 result += line;
36             }
37         } catch (Exception e) {
38             e.printStackTrace();
39         } finally {
40             try {
41                 if (in != null) {
42                     in.close();
43                 }
44             } catch (Exception e) {
45                 e.printStackTrace();
46             }
47         }
48         return result;
49     }
50     
51     public static String sendPost(String url,  String param) {
52         PrintWriter out =  null;
53         BufferedReader in = null;
54         String result = "";
55         try {
56             String urlNameString = url + "?" + param;
57             URL resultUrl = new URL(urlNameString);
58             URLConnection conn = resultUrl.openConnection();
59             //设置通用属性
60             conn.setRequestProperty("accept", "*/");
61             conn.setRequestProperty("connection", "Keep-Alive");
62             //发送post请求必须设置下面两行
63             conn.setDoOutput(true);
64             conn.setDoInput(true);
65             out = new PrintWriter(conn.getOutputStream());
66             out.print(param);
67             out.flush();
68             Charset cs = Charset.forName("utf-8");
69             in = new BufferedReader(new InputStreamReader(conn.getInputStream(), cs));
70             String line;
71             while((line = in.readLine()) != null) {
72                 result += line;
73             }
74         } catch (Exception e) {
75             e.printStackTrace();
76         } finally {
77             try {
78                 if (out != null) {
79                     out.close();
80                 }
81                 if (in != null) {
82                     in.close();
83                 }
84             } catch (Exception e) {
85                 e.printStackTrace();
86             }
87         }
88         return result;
89     }
90     
91     public static void main(String[] args) {
92         String get = HttpRestTest.sendGet("http://fysola.cnblogs.com/", "");
93         System.out.println(get);
94         System.out.println("================================================");
95         String post = HttpRestTest.sendGet("http://fysola.cnblogs.com/", "");
96         System.out.println(post);
97         
98     }
99 }

 

执行结果如下,

 1 null--->[HTTP/1.1 200 OK]
 2 Vary--->[Accept-Encoding]
 3 Date--->[Sat, 19 Nov 2016 04:50:32 GMT]
 4 Content-Length--->[14744]
 5 Expires--->[Sat, 19 Nov 2016 04:50:41 GMT]
 6 X-UA-Compatible--->[IE=10]
 7 Last-Modified--->[Sat, 19 Nov 2016 04:50:31 GMT]
 8 Connection--->[keep-alive]
 9 Content-Type--->[text/html; charset=utf-8]
10 Cache-Control--->[private, max-age=10]
11 <!DOCTYPE html><html lang="zh-cn"><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1" /><title>fysola - 博客园</title><link type="text/css" rel="stylesheet" href="/bundles/blog-common.css?v=Rdf1BBttS5_qVaET1myrajVTd62BSCCoJA9fZxGv1ZM1"/><link >        <!--done-->Copyright &copy;2016 fysola    </div><!--end: footer --></div><!--end: home 自定义的最大容器 --></body></html>
12 ================================================
13 null--->[HTTP/1.1 200 OK]
14 Vary--->[Accept-Encoding]
15 Date--->[Sat, 19 Nov 2016 04:50:32 GMT]
16 Content-Length--->[14744]
17 Expires--->[Sat, 19 Nov 2016 04:50:42 GMT]
18 X-UA-Compatible--->[IE=10]
19 Last-Modified--->[Sat, 19 Nov 2016 04:50:32 GMT]
20 Connection--->[keep-alive]
21 Content-Type--->[text/html; charset=utf-8]
22 Cache-Control--->[private, max-age=10]
23 <!DOCTYPE html><html lang="zh-cn"><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1" /><title>fysola - 博客园</title><link type="text/css" rel="stylesheet" href="/bundles/blog-common.css?v=Rdf1BBttS5_qVaET1myrajVTd62BSCCoJA9fZxGv1ZM1"/><link >        <!--done-->Copyright &copy;2016 fysola    </div><!--end: footer --></div><!--end: home 自定义的最大容器 --></body></html>
View Code

相关文章: