一、概念
Java为了可移植性,不允许直接调用操作系统,而是由java.net包来提供网络功能。Java虚拟机负责提供与操作系统的实际连接。
InetAddress
作用:封装计算机的IP地址和DNS(没有端口信息)。
注:DNS是Domain Name System,域名系统。
特点:这个类没有构造方法。如果要得到对象,只能通过静态方法:getLocalHost()、getByName()、 getAllByName()、 getAddress()、getHostName()。
InetSocketAddress
作用:包含IP和端口信息,常用于Socket通信。此类实现 IP 套接字地址(IP 地址 + 端口号),不依赖任何协议。
/*** * IP:定位一个节点(计算机】路由器) 区分小区,定位主机 * 端口(2个字节,16位,0-65535):区分房间,定位具体软件 如: 8080:Tomcat服务器 ,1521:Oracle服务器,3306:mysql服务器 * 查看所有端口:netstat -ano ;查看指定端口:netstat -ano|findstr "8080" ;查看指定进程:talklist|findstr "3272" * (8080为某个具体端口的名字,3272为某个具体进程的名字) * */ package cn.sxt.net; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.UnknownHostException; public class Test_0413_Net { public static void main(String[] args) throws UnknownHostException { //通过getLocalHost()方法创建InetAddress对象,操作本机信息 InetAddress addr = InetAddress.getLocalHost();// host:主机,主人 System.out.println(addr.getHostAddress());//获取本机IP System.out.println(addr.getHostName());//获得本机名字 //根据域名获得计算机节点信息 InetAddress addr2 = InetAddress.getByName("www.baidu.com"); System.out.println(addr2.getHostAddress()); // 返回百度服务器的IP:220.181.112.244 System.out.println(addr2.getHostName());//返回百度的服务器的名字:www.baidu.com //根据IP获得计算机节点信息 InetAddress addr3 = InetAddress.getByName("59.110.14.7"); System.out.println(addr3.getHostAddress()); // 返回sxt服务器的IP:59.110.14.7 System.out.println(addr3.getHostName());//输出ip而不是域名。如果这个IP地址不存在或DNS服务器不允许进行IP地址 //和域名的映射,getHostName方法就直接返回这个IP地址。 //套接字,端口 InetSocketAddress socketAddress = new InetSocketAddress("127.0.0.1", 8080);//地址,端口号 InetSocketAddress socketAddress2 = new InetSocketAddress("localhost", 9000);//域名,端口号,localhost 本机域名 System.out.println(socketAddress.getAddress()); System.out.println(socketAddress.getHostName()); System.out.println(socketAddress.getPort());//获得端口号 System.out.println(socketAddress2.getAddress()); } }
URL类
/*** 网络3大基石:html、 url、 http * URD:统一资源名称 如:磁力链接 * URL:统一资源定位符 http://www.baidu.com:80/index.html * 包含:协议,域名/计算机,端口(默认80),请求资源 */ package cn.sxt.net; import java.net.MalformedURLException; import java.net.URL; public class Test_0414_URL { public static void main(String[] args) throws MalformedURLException { URL u = new URL("http://www.google.cn:80/index.html?uname=shsxt&age=18#a");//"?" 参数 标志 , "#" 锚点标志 System.out.println("协议:" + u.getProtocol());//协议:http ,Protocol:协议,草案 System.out.println("主机名:" + u.getHost()); //域名: www.google.cn System.out.println("端口:" + u.getPort()); //端口号:80 System.out.println("请求资源:" + u.getFile()); // 端口号后面,锚点前的所有内容:index.html?uname=shsxt&age=18 System.out.println("路径:" + u.getPath()); // 端口号后面,参数前的所有内容 index.html System.out.println("参数部分:" + u.getQuery());//参数内容: uname=shsxt&age=18 Query:查询,询问 System.out.println("锚点部分:" + u.getRef());//锚点内容: a System.out.println("获取与此url关联的协议的默认端口:" + u.getDefaultPort()); URL u1 = new URL("http://www.abc.com/aa/"); URL u2 = new URL(u, "2.html"); // 相对路径构建url对象 System.out.println(u2.toString()); // http://www.abc.com/aa/2.html } }
/*** * 模拟网络爬虫 模拟浏览器 */ package cn.sxt.net; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import javax.net.ssl.HttpsURLConnection; public class Test_0414_Spider { public static void main(String[] args) throws Exception { //获取url //URL url=new URL("https://www.jd.com"); URL url=new URL("https://www.dianping.com"); HttpURLConnection con=(HttpURLConnection)url.openConnection();//应对网站的反爬的办法 con.setRequestMethod("GET");//从服务器请求数据 ,模拟浏览器的get请求 con.setRequestProperty("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"); //下载资源 //InputStream iStream=url.openStream(); BufferedReader bReader=new BufferedReader(new InputStreamReader(con.getInputStream(),"UTF-8")); String msg=null; while ((msg=bReader.readLine())!=null) { System.out.println(msg); } bReader.close(); //分析 } }