一. 网络基础简介
1. 简介
TCP/IP是目前世界上应用最为广泛的协议,是以TCP和IP为基础的不同层次上多个协议的集合。也称:TCP/IP协议族或TCP/IP协议栈。
其中TCP全称Transmission Control Protocol,意为传输控制协议,IP全称Internet Protocol意为互联网协议
2. TCP/IP模型
由低到高共分为五层:物理层 —> 数据链路层 —> 网络层 —> 传输层 —> 应用层 ,TCP/IP属于传输层的协议,而用户直接接触到的是应用层,应用层有HTTP超文本传输协议,FTP文件传输协议,SMTP简单邮件传输协议,Telnet远程登录登录服务等等。
3. IP地址
为实现网络中不同计算机之间的通信,每台机器都必须有一个唯一的标识,也就是IP地址,一般我们常见的IP比如192.168.1.1都是IPV4,该版本定义了IP地址是由32位的二进制组成
4. 端口号
端口号用于区分不同应用程序,每个独立的应用程序都有一个单独的端口号。端口号范围为0~65535,其中0~1023为系统所保留。IP地址和端口号组成了所谓的Socket,Socket是网络上运行的程序之间双向通信链路的终结点,是TCP和UDP的基础。常用端口号:http:80 、ftp:21、telnet:23
5. Java中的网络支持
针对网络通信的不同层次,Java提供的网络功能有四大类:
1、InetAddress:用于标识网络上的硬件资源
2、URL:统一资源定位符,通过URL可以直接读取或写入网络上的数据
3、Sockets:使用TCP协议实现网络通信的Socket相关的类
4、Datagram:使用UDP协议,将数据保存在数据报中,通过网络进行通信
二. InetAddress
InetAddress类主要用于标识网络上的硬件资源,表示互联网协议(IP)地址。该类没有任何构造方法,无法通过new的方式创建该类对象,查看InetAddress的文档可以看到该类有多个静态方法的返回值都是InetAddress,所以我们可以通过这些静态方法来返回InetAddress的实例,常用的三个方法:
-
通过本机获取InetAddress实例: InetAddress.getLocalHost();
-
通过计算机名获取InetAddress实例: InetAddress.getByName(“计算机名”);
-
通过IP地址获取InetAddress实例: InetAddress.getLocalHost(IP地址);
@Test public void contextLoads() { try { //获取本机的InetAddress实例 InetAddress address = InetAddress.getLocalHost(); System.out.println("计算机名:" + address.getHostName()); System.out.println("计算机IP地址:" + address.getHostAddress()); System.out.println("InetAddress对象:" + address); System.out.println("计算机IP地址字节数组形式:" + Arrays.toString(address.getAddress())); byte[] as = address.getAddress(); int[] is = new int[as.length]; for (int i = 0; i < as.length; i++) { is[i] = as[i]; if(is[i] < 0) { is[i] += 256; } } System.out.println("计算机IP地址字节数组形式:" + Arrays.toString(is)); //根据机器名获取InetAddress实例 InetAddress zhangJia = InetAddress.getByName("ZhangJia"); System.out.println("计算机IP地址:" + zhangJia.getHostAddress()); //根据IP地址获取InetAddress实例 InetAddress ip = InetAddress.getByName("192.168.112.1"); System.out.println("计算机IP地址:" + ip.getHostAddress()); } catch (UnknownHostException e) { e.printStackTrace(); } } 输出: 计算机名:ZhangJia 计算机IP地址:192.168.112.1 InetAddress对象:ZhangJia/192.168.112.1 计算机IP地址字节数组形式:[-64, -88, 112, 1] 计算机IP地址字节数组形式:[192, 168, 112, 1] 计算机IP地址:192.168.112.1 计算机IP地址:119.28.203.103 计算机IP地址:/119.28.203.103
三. URL
URL(Uniform Resource Locator)统一资源定位符,表示Internet上某一资源的地址。URL由两部分组成:协议名称和资源名称,中间用冒号隔开。比如https://zhangjia.pro,其中https就是协议,而zhangjia.io就是资源名称。在java.net包中,提供了URL类来表示URL,URL类的常用方法如下:
@Test public void contextLoads() { try { //创建一个URL实例 URL zhangjia = new URL("https://zhangjia.pro"); //根据已经存在的URL实例创建新的URL实例 URL url = new URL(zhangjia,"1.html?username=zj&age=22#test"); System.out.println("协议" + zhangjia.getProtocol()); System.out.println("主机" + zhangjia.getHost()); //如果未指定端口号,则根据不同的协议使用默认的端口号 // 但是对于getPort而言,如果你没指定端口号,那么默认返回-1 System.out.println("端口号" + zhangjia.getPort()); System.out.println("文件路径" + url.getPath()); System.out.println("文件名称" + url.getFile()); System.out.println("相对路径" + url.getRef()); System.out.println("查询字符串" + url.getQuery()); } catch (MalformedURLException e) { e.printStackTrace(); } } 输出: 协议https 主机zhangjia.io 端口号-1 文件路径/1.html 文件名称/1.html?username=zj&age=22 相对路径test 查询字符串username=zj&age=22
我们还可以通过URL的openStream()对象方法来获取指定资源的输入流,有了输入流,我们就可以读取和访问网络上的数据。
@Test public void contextLoads() { try { //1. 创建一个URL实例 URL zhangjia = new URL("https://zhangjia.pro"); //2. 通过URLopenStream方法获取URL对象所表示的资源的字节输入流 InputStream inputStream = zhangjia.openStream(); //3. 将字节输入流转换为字符输入流 InputStreamReader inputStreamReader = new InputStreamReader(inputStream,"utf-8"); //4. 为字符输入流添加缓冲,提高读取效率 BufferedReader bufferedReader = new BufferedReader(inputStreamReader); //5. 读取数据,一次读取一行 String data = bufferedReader.readLine(); while (data != null ) { System.out.println(data); data = bufferedReader.readLine(); } //6. 关闭各种流 bufferedReader.close(); inputStreamReader.close(); inputStream.close(); } catch (Exception e) { e.printStackTrace(); } } 输出: 整个网页的源代码
参考资料
本文所有内容根据慕课网汤小洋老师:Java Socket应用—通信是这样练成的 教程整理而成
请登录之后再进行评论