1 网络基础简介
1.1 两台计算机通信
两台计算机需要通过网络进行通信,需要满足三个必备条件:IP地址(所处位置和身份)、协议(共同的语言)和端口号。
1.1.1 TCP/IP协议
- TCP/IP是目前世界上应用最为广泛的协议
- 是以TCP/IP为基础的不同层次上多个协议的集合
- 也称为:TCP/IP协议族 或 TCP/IP协议栈
- TCP:Transmission Control Protocol—传输控制协议
IP:Internet Protocol—互联网协议
如下图,TCP/IP模型:
IP地址和端口号组成了所谓的Socket,Socket是网络上运行的程序之间双向通信链路的终结点,是TCP和UDP的基础
- IP地址是为实现网络中不同计算机之间的通信,每台计算机必须有一个唯一的标识,在IPv4中是32位的2进制编码
- 端口号用于区分不同的应用程序,端口号的范围是0~65535,其中0~1023为系统所保留,自己使用建议使用1023之后的端口号(http:80,ftp:21,telnet:23)
1.1.2 Java中的网络支持
针对网络通信的不同层次,Java提供的网络功能的四大类:
- InetAddress:用于标识网络上的硬件资源
- URL:统一资源定位符,通过URL可以直接读取或写入网络上的数据
- Sockets:使用TCP协议实现网络通信的Socket相关的类
- Datagram:使用UDP协议,将数据保存在数据报中,通过网络进行通信
2 Java中InetAddress类的应用
InetAddress类用于标识网络上的硬件资源,表示互联网协议(IP)地址。
InetAddress类没有提供构造方法,获取InetAddress类可以通过以下几个构造方法:
返回类型 | 方法名 | 说明 |
---|---|---|
static InetAddress | getLocalHost() | 返回本地主机 |
static InetAddress | getByName(String host) | 在给定主机名的情况下确定主机的 IP 地址 |
static InetAddress | getByAddress(String host,byte[] addr) | 根据提供的主机名和 IP 地址创建InetAddress |
static InetAddress | getByAddress(byte[] addr) | 在给定原始IP地址的情况下,返回InetAddress对象 |
static InetAddress | getAllByName(String host) | 在给定主机名的情况下,根据系统上配置的名称服务返回其IP地址所组成的数组 |
获取本机的InetAdress实例,并通过getHostName()和getHostAddress()方法获取计算机名称和IP地址,通过getAddress()获取IP地址的字节数组形式,同时直接输出InetAddress对象将得到”主机名\IP地址“形式:
InetAddress address = InetAddress.getLocalHost(); System.out.println("本地计算机名:"+address.getHostName()); System.out.println("IP地址:"+address.getHostAddress()); System.out.println("IP地址的字节数组形式:"+Arrays.toString(address.getAddress())); System.out.println("主机名/IP地址:"+address);
根据机器名称获取InetAddress实例:
InetAddress address2 = InetAddress.getByName("DESKTOP-TN9JAVS");
根据IP地址获取InetAddress实例:
byte[] byte_id = {(byte) 192,(byte) 168,1,(byte) 169}; InetAddress address2 = InetAddress.getByName(byte_id);
3 Java中的URL应用
- URL(Uniform Resource Locator,统一资源定位符)表示Internet上某一资源的地址;
- URL由两部分组成:协议名称和资源名称,中间用冒号隔开;
- java.net包中提供了URL类来表示URL。
3.1 创建URL实例
构造方法 | 说明 |
---|---|
URL(String spec) | 根据 String 表示形式创建 URL 对象 |
URL(String protocol, String host, int port, String file) | 根据指定protocol、host、port号和file创建URL对象 |
URL(String protocol,String host,int port,String file,URLStreamHandler handler) | 根据指定的protocol、host、port号、file和 handler创建URL对象 |
URL(String protocol,String host,String file) | 根据指定的protocol名称、host名称和file名称创建URL |
URL(URL context, String spec) | 通过在指定的上下文中对给定的spec进行解析创建URL |
URL(URL context,String spec,URLStreamHandler handler) | 通过在指定的上下文中用指定的处理程序对给定的spec进行解析来创建URL |
创建一个URL实例,并通过该实例创建一个新的URL实例:
//创建一个URL实例
URL CSDN = new URL("http://www.csdn.net/");
//根据已存在的URL创建新的URL,?后表示参数,#表示锚点
URL url = new URL(CSDN,"index.html?hostname=jack#practice");
System.out.println("此URL的协议名称:"+url.getProtocol());
System.out.println("此URL的主机名(如果适用):"+url.getHost());
//如果未指定端口号,则使用默认的端口号,此时getPort()方法均返回-1,表示使用的是默认值
System.out.println("此URL的端口号:"+url.getPort());
System.out.println("此URL的文件名:"+url.getFile());
System.out.println("此URL的锚点(也称为“引用”):"+url.getRef());
System.out.println("获取此URL的查询部分:"+url.getQuery());
3.2 使用URL获取网页资源
通过URL对象的openStream()方法得到指定资源的输入流,将字节输入流转换为字符输入流,为字符输入流添加缓冲提高效率:
URL url = new URL("http://www.baidu.com"); InputStream is = url.openStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr);
通过流可以读取、访问网络上的数据,用BufferedReader的readline()方法按行读入:
String data = br.readline();
备注:
1. 注意抛出的异常
2. 注意关闭字节\字符流