Java——网络编程
网络编程的三个重要概念
- IP(Internet Protocol),英特网互联协议,每个网络节点都可以用IP地址唯一确定。
- port,端口,在每个网络节点上区分不同软件。
- URL(United Resource Locator),统一资源定位符,确定放置在Internet上的每个资源的位置。
网络通信协议是计算机网络中连接和通信的规则。目前应用最广泛的有TCP/IP(Transmission Control Protocol/Internet Protocol)协议,以及UDP(User Datagram Protocol)协议。
TCP/IP网络模型
采用分层的设计方法,简化为四层:
①数据链路层,比如驱动程序、接口等,也叫网络接口层。用于定义物理传输通道,通常是对某些网络连接设备的驱动协议。
②网络层,比如IP、ICMP、IGMP。这一层是核心,用于将传输的数据分组,将分组数据发送至目标计算机或网络。
③传输层,如TCP、UDP。使网络程序进行通信。
④应用层,如HTTP、FTP、DNS。主要为互联网中的各种网络应用提供服务。
IP地址
目前应用广泛的还是IPv4,用4个字节大小的二进制表示,转为十进制例如10.0.0.1。IPv6的出现是为了扩大需求。IP地址由两部分组成:网络,主机。分成5类:
A类地址:由第一段网络地址和其余三段的主机地址表示。范围是1.0.0.0到127.255.255.255。包含私有地址和保留地址。
B类地址:由前两段网络地址和后两段的主机地址表示。范围是128.0.0.0到191.255.255.255。包含私有地址和保留地址。
C类地址:由前三段网络地址和剩余一段的主机地址表示。范围是192.0.0.0到223.255.255.255。包含私有地址。
D类地址的范围:224.0.0.1到239.255.255.254
E类地址范围:240.0.0.1到255.255.255.254
供组织内部使用的非注册IP范围: 192.168.0.0 到 192.168.255.255127.0.0.1
本机IP用127.0.0.1表示
Java中为网络提供的类
Java中提供了一个与IP地址有关的InetAddress类。
public class Demo2 {
public static void main(String[] args) throws IOException {
// 获取本地主机InetAddress对象
InetAddress localAddress = InetAddress.getLocalHost();
// 获取主机名为“www.baidu.cn”的InetAddress对象
InetAddress remoteAddress = InetAddress.getByName("www.baidu.com");
System.out.println("本机的IP地址" + localAddress.getHostAddress());
System.out.println("百度的IP地址" + remoteAddress.getHostAddress());
System.out.println("三秒钟内是否可以访问" + remoteAddress.isReachable(3000));
System.out.println("百度的主机名为" + remoteAddress.getHostName());
}
}
//运行结果:
本机的IP地址192.168.100.1
百度的IP地址180.101.49.11
三秒钟内是否可以访问true
百度的主机名为www.baidu.com
Java中还提供了一个InetSocketAddress类,实现了获取IP+端口的网络对象。
public class Demo3 {
public static void main(String[] args) {
//创建指定地址加端口号的套接字
InetSocketAddress i = new InetSocketAddress("www.baidu.com",80);
System.out.println(i);
System.out.println("套接字地址的IP为:"+i.getHostName());
System.out.println("套接字地址的端口为:"+i.getPort());
}
}
//运行结果:
www.baidu.com/180.101.49.12:80
套接字地址的IP为:www.baidu.com
套接字地址的端口为:80
用URL类可以获得代表制定资源的对象。
public class Demo4 {
public static void main(String[] args) throws MalformedURLException {
//参数需要协议+IP+端口(可默认缺省)+资源路径和名称
URL url = new URL("https://blog.csdn.net:80/candycrush_CL/article/details/107325200");
//打印
System.out.println(url);
System.out.println("协议:"+url.getProtocol());
System.out.println("域名:"+url.getHost());
System.out.println("端口:"+url.getPort());
System.out.println("资源:"+url.getFile());
System.out.println("文件:"+url.getPath());
}
}
//运行结果:
https://blog.csdn.net:80/candycrush_CL/article/details/107325200
协议:https
域名:blog.csdn.net
端口:80
资源:/candycrush_CL/article/details/107325200
文件:/candycrush_CL/article/details/107325200
简单的爬虫
/**
* 网络爬虫取链接
*/
public class Test1 {
public static String getUrlContent(String url) {
StringBuilder sb=new StringBuilder();
BufferedReader br = null;
try {
URL u=new URL(url);
br=new BufferedReader(new InputStreamReader(u.openStream()));
String tmp=null;
while((tmp=br.readLine())!=null) {
sb.append(tmp);
sb.append("\n");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return sb.toString();
}
public static void main(String[] args) {
String str = getUrlContent("https://www.163.com");
//Pattern p=Pattern.compile("<a[\\s\\S]+?</a>");
Pattern p=Pattern.compile("(href=\\s*)(\\\"http[\\s\\S]+?\\\")");
Matcher m=p.matcher(str);
while(m.find()) {
System.out.println(m.group(2));
}
}
}