本文主要介绍java.net下为网络编程提供的一些基础包,InetAddress代表一个IP协议对象,可以用来获取IP地址,Host name之类的信息。URL和URLConnect可以用来访问web资源,URLDecode和URLEncode用来转换字符串。 本文会写两个例子来演示java网络编程的一些基本用法。
第一个例子,用java实现http get 和 post请求
本例涉及如下知识点,
- HTT协议规范
- 使用URL对象建立HTTP协议的网络连接URLConnection对象conn,本地和网络通信就靠这个对象的getInputStream和getOutputStream方法
- 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 ©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 ©2016 fysola </div><!--end: footer --></div><!--end: home 自定义的最大容器 --></body></html>