网络编程基础
- Java 语言提供了非常强大的网络类,屏蔽了底层的复杂细节,使程序员可以很容易地编写处网络程序;
1. IP 地址和端口
- 虽然通过计算机网络可以使多台计算机实现连接,但是位于同一个网络中的计算机在进行连接和通信时必须遵守一定的规则,这就好比在道路中行驶的汽车一定要遵守交通规则一样。在计算机网络中,这些连接和通信的规则称为网络通信协议,它对数据的传输格式、传输速率、传输步骤等做了统一规定,通信双方必须同时遵守网络通信协议才能完成数据交换;
- 网络通信协议有很多种,目前应用最广泛的是 TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/英特网互联协议)、UDP(User Datagram Protocol,用户数据报协议)、ICMP(Internet Control Message Protocol,Internet 控制报文协议)和其他一些协议的协议族;
- 本章所介绍的网络编程知识主要是基于 TCP/IP 中的内容。在学习具体的内容之前,首先来了解一下 TCP/IP。TCP/IP(又称 TCP/IP 协议簇)是一组用于实现网络互联的通信协议,其名称来源于该协议族中两个重要的协议(TCP 协议和 IP 协议)。基于 TCP/IP 的模型将协议分成 4 个层次:
- TCP/IP 模型中的 4 层分别是链路层、网络层、传输层和应用层,每层分别负责不同的通信功能,具体功能如下:
- 链路层也称为网络接口层,该层负责监视数据在主机和网络之间的交换。事实上,TCP/IP 本身并未定义该层的协议,而由参与互连的各网络使用自己的物理层和数据链路层协议与 TCP/IP 模型的网络层进行连接;
- 网络层也称网络互联层,是整个 TCP/IP 的核心,它主要用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络;
- 传输层主要使网络程序进行通信,在进行网络通信时,可以采用 TCP,也可以采用 UDP;
- 应用层主要负责应用程序的协议,例如 HTTP、FTP 等;
- IP 地址和端口号的作用:
2. InetAddress 类
- JDK 提供了一个与 IP 地址相关的 InetAddress 类,该类用于封装一个 IP 地址,并提供一系列与 IP 地址相关的方法;
- java.net.InetAddress,详见:Class InetAddress;
import java.net.InetAddress;
public class Test {
public static void main(String[] args) throws Exception {
InetAddress localAddress = InetAddress.getLocalHost();
InetAddress remoteAddress = InetAddress.getByName("www.sohu.com");
System.out.println("本机的IP 地址:" + localAddress.getHostAddress());
System.out.println("sohu 的IP 地址:" + remoteAddress.getHostAddress());
System.out.println("3s 是否可达:" + remoteAddress.isReachable(3000));
System.out.println("sohu 的主机名为:" + remoteAddress.getHostName());
}
}
3. UDP 和 TCP
- 传输层的两个重要的高级协议,分别是 UDP 和 TCP。UDP 是 User Datagram Protocol 的简称,称为用户数据报协议;TCP 是 Transmission Control Protocol 的简称,称为传输控制协议;
- UDP 是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。简单来说,当一台计算机向另外一台计算机发送数据时,发送端不确认接收端是否存在,就发出数据;同样,接收端在收到数据时,也不会向发送端反馈是否收到数据。由于使用 UDP 消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输,例如视频会议使用 UDP,因为这种情况即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。但是在使用UDP 传送数据时,由于 UDP 的面向无连接性,不能保证数据的完整性,因此在传输重要数据时不建议使用 UDP;
- TCP 是面向连接的通信协议,即在传输数据前先在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠、无差错的数据传输。在 TCP 连接中必须明确客户端与服务器端,由客户端向服务器端发出连接请求,每次连接的创建都需要经过三次握手。第一次握手,客户端向服务器端发出连接请求,等待服务器端确认;第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求;第三次握手,客户端再次向服务器端发送确认信息,确认连接;