1.网络编程概述
网络编程是指在Java程序中使用网络技术来实现网络通信的过程,包括网络的建立、连接、数据传输等。
Java提供了一系列的类和接口来支持网络编程,其中最常用的是java.net包。该包中包含了各种类和接口,用于创建网络连接、发送和接收数据等操作。
在网络编程中,常见的网络协议有TCP/IP协议和UDP协议。TCP/IP协议提供可靠的、面向连接的数据传输,而UDP协议提供不可靠的、面向数据报的数据传输。
Java中可以使用Socket类来实现TCP/IP协议的网络编程,通过创建一个Socket对象,可以建立一个与服务器的连接,然后使用输入输出流来发送和接收数据。
Java还提供了DatagramSocket和DatagramPacket类来实现UDP协议的网络编程,通过创建一个DatagramSocket对象,可以建立一个UDP连接,然后使用DatagramPacket对象来发送和接收数据。
除了Socket和DatagramSocket类,Java还提供了URL、URLConnection和HttpURLConnection等类来处理HTTP协议的网络通信。
在网络编程中,需要注意以下几点:
- 客户端和服务器端的IP地址和端口号必须匹配,才能建立连接。
- 数据传输时需要使用输入输出流进行读写操作。
- 网络通信是在一个独立的线程中进行的,需要注意线程安全的问题。
- 异常处理是必不可少的,需要处理可能出现的网络异常。
- 网络编程中的性能优化也是一个重要的问题,可以通过一些技术手段来提高网络传输的效率。
总的来说,Java网络编程是实现网络通信的一种方式,在实际应用中广泛使用,可以用于开发各种网络应用程序,如聊天室、文件传输、远程控制等。
1.1软件架构
1.2网络基础
计算机网络:
把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统,从而使众多的计算机可以方便地互相传递信息、共享硬件、软件、数据信息等资源。网络编程的目的:
直接或间接地通过网络协议与其它计算机实现数据交换,进行通讯。
网络编程中有三个主要的问题:
问题1:如何准确地定位网络上一台或多台主机。//IP地址
问题2:如何定位主机上的特定的应用。//端口号
问题3:找到主机后,如何可靠、高效地进行数据传输。//通信协议
2.网络通信要素
2.1通信要素一:IP地址和域名
2.1.1IP地址
IP地址(Internet Protocol address)是互联网上设备所使用的唯一标识符。它是一个由四个数字组成的标识符,每个数字的取值范围为0到255,四个数字用点分隔开,例如192.168.0.1。IP地址用于在互联网上定位和识别设备,可以被用于发送和接收数据。
2.1.2IP地址分为两种类型
IPv4和IPv6。
IPv4是目前使用最广泛的版本,以32位二进制表示,约有42亿个可用地址。(4个字节)
IPv6是IPv4的新一代协议,以128位二进制表示,拥有更多的可用地址。(16个字节)
IP地址可以用于确定设备的位置、网络连接和通信。它可以用于设置网络中的路由和转发数据包,同时也用于识别网络中的设备,例如计算机、服务器、路由器等。
2.1.3域名
域名是由一串字符组成的地址,用于标识一个或多个服务器的名称。它通常用于访问网站,发送电子邮件,或者作为网络资源的标识。域名由一级域名和二级域名组成,一级域名是*域名的最左边部分,而二级域名是*域名的下一级。域名解析系统将域名转换为对应的IP地址,使计算机能够找到和访问特定的服务器。域名可以通过域名注册商购买和注册,并且需要定期续费以保持所有权。www.mi.com
域名解析(Domain Name System,简称DNS)是将域名解析为对应的IP地址的一种技术。
在互联网上,每个网络节点都有一个唯一的IP地址来标识自己,而IP地址是一串数字,对于人来说不太容易记忆。为了方便人们使用互联网,域名系统将这些数字IP地址与易于记忆的域名进行关联。
当我们在浏览器中输入一个域名时,浏览器会向DNS服务器发送一个请求,DNS服务器会根据域名解析查询,找到对应的IP地址并返回给浏览器。然后浏览器根据该IP地址与目标服务器建立连接,最终完成浏览器与服务器之间的通信。
域名解析过程可以简化为以下几个步骤:
- 浏览器向DNS服务器发送域名解析请求;
- DNS服务器根据自身的缓存或者向其他DNS服务器查询,找到对应的IP地址;
- DNS服务器将找到的IP地址返回给浏览器;
- 浏览器根据获得的IP地址与目标服务器建立连接。
域名解析的过程中还涉及到域名的层级划分,如*域名(TLD)、二级域名(SLD)和子域名等。不同层级的域名可以由不同的注册商进行注册和管理。
需要注意的是,域名解析的过程中可能会存在一定的延迟,因此可以考虑使用较快速的DNS服务器或者进行缓存来提高域名解析的效率。
2.2通信要素二:端口号
端口号是计算机网络中用于区分不同应用程序或服务的数字标识。在传输控制协议/互联网协议(TCP/IP)。
端口号范围从0到65535,其中0到1023为系统端口号,用于一些常见的应用程序和服务,如HTTP(端口号80)、FTP(端口号21)等。用户也可以自定义端口号来标识自己的应用程序或服务。
2.3通信要素三:网络通信协议
2.3.1通信协议的目的
通信协议的主要目的是确保不同系统、设备或应用程序之间的通信能够顺利进行。通过定义通信协议,可以规定通信的格式、规则、流程和约定,以便实现数据传输、交换、共享和处理等功能。通信协议的目的包括:
提供一种标准的通信方式:通信协议定义了数据的格式、编码方式、传输速率、错误检测和纠正机制等,确保通信双方能够理解和解释传输的数据。
提高系统之间的互操作性:不同的系统、设备或应用程序可能使用不同的通信协议和技术,通过定义标准的通信协议,可以实现系统之间的互联和互操作,使得它们能够相互通信和交互。
简化开发和维护工作:通信协议提供了一种统一的编程接口和规范,使得开发人员可以使用相同的方法进行开发和集成,简化了开发和维护的工作量。
提高通信的效率和可靠性:通信协议规定了数据的传输方式和流程,包括数据的分割、传输顺序、数据确认和重传机制等,可以提高通信的效率和可靠性。
支持不同网络环境和技术:通信协议可以适应不同的网络环境和技术,包括局域网、广域网、移动网络等,确保通信在各种网络环境下都能正常进行。
2.3.2网络参考模型
OSI参考模型:将网络分为7层,过于理想化。
TCP/IP参考模型:将网络协议分为四层:应用层,传输层,网络层,物理+数据链路层。事实上使用的标准。
3.InetAddress的使用
3.1作用
InetAddress类的一个实例就代表一个具体的ip地址。
3.2常用方法
InetAddress类是Java网络编程中最常用的类之一,用于表示IP地址和域名。以下是InetAddress类的一些常用方法:
getByName(String host)
:根据指定的主机名或IP地址,返回对应的InetAddress对象。 例如:InetAddress address = InetAddress.getByName("www.example.com");
getLocalHost()
:返回表示本地主机的InetAddress对象。 例如:InetAddress localHost = InetAddress.getLocalHost();
getHostName()
:返回地址的主机名。 例如:String hostName = address.getHostName();
getHostAddress()
:返回地址的IP地址。 例如:String ip = address.getHostAddress();
isReachable(int timeout)
:检测指定地址是否可达,参数为超时时间(单位为毫秒)。 例如:boolean reachable = address.isReachable(5000);
equals(Object obj)
:比较两个InetAddress对象是否相等。 例如:boolean isEqual = address1.equals(address2);
4.TCP与UDP网络编程
4.1TCP与UDP网络编程对比
通信的协议还是比较复杂的,java.net 包中包含的类和接口,它们提供低层次的通信细节。我们可以直接使用这些类和接口,来专注于网络程序开发,而不用考虑通信的细节。
java.net 包中提供了两种常见的网络协议的支持
UDP : 用户数据报协议(User Datagram Protocol).
TCP : 传输控制协议(Transmission Control Protocol)。TCP协议:
。TCP协议进行通信的两个应用进程:客户、服务端。
。使用TCP协议前,须先建立TCP连接,形成基于字节流的传输数据通道
。传输前,采用“三次握手”方式,点对点通信,是可靠的。
TCP协议使用重发机制 ,当一个通信实体发送一个消息给另一个通信实体后,要 收到另一个通信实体确认信息,如果没有收到另一个通信实体确认信息,则会再次 重复刚才发送的消息。
。在连接中可进行大数据量的传输。
。传输完毕,需释放已建立的连接,效率低。
UDP协议:
。UDP协议进行通信的两个应用进程:发送端、接收端。
。将数据、源、目的封装成数据包(传输的基本单位),不需要建立连接。
。发送不管对方是否准备好,接收方收到也不确认,不能保证数据的完整性,故是不可靠的。
。每个数据报的大小限制在64K内。
。发送数据结束时无需释放资源,开销小,通信效率高。。适用场景:音频、视频和普通数据的传输。例如视频会议。
4.2三次握手
4.3四次挥手
TCP切中在发送数据结束后,释放连接时需要经过四次挥手。
。第一次挥手:客户端向服务器端提出结束连接,让服务器做最后的准备工作 。此时,客户端处于半关闭状态,即表示不再向服务器发送数据了,但是还可以接受数据。
。第二次挥手:服务器接收到客户端释放连接的请求后,会将最后的数据发给客户端 。并告知上层的应用进程不再接收数据。
。第三次挥手:服务器发送完数据后,会给客户端发送一个释放连接的报文。那么客户端接收后就知道可以正式释放连接了。
。第四次挥手:客户端接收到服务器最后的释放连接报文后,要回复一个彻底断开的报文。这样服务器收到后才会彻底释放连接。这里客户端,发送完最后的报文后,会等待2MSL,因为有可能服务器没有收到最后的报文,那么服务器迟迟没收到,就会再次给客户端发送释放连接的报文,此时客户端在等待时间范围内接收到。会重新发送最后的报文,并重新计时。如果等待2MSL后,没有收到,那么彻底断开。
5.网络编程API
5.1InetAddrss类
InetAddress类是Java编程语言中的一个类,用于表示互联网地址。它提供了一些方法来获取和操作IP地址和域名。
InetAddress类的常用方法有:
getByName(String host)
:根据主机名称或IP地址字符串创建一个InetAddress对象。getHostAddress()
:返回InetAddress对象的IP地址字符串。getHostName()
:返回InetAddress对象的主机名。isReachable(int timeout)
:测试InetAddress对象是否可以到达,并在指定的超时时间内等待响应。isLoopbackAddress()
:检查InetAddress对象是否是回环地址。isMulticastAddress()
:检查InetAddress对象是否是多播地址。以下是一个使用InetAddress类的例子:
import java.net.InetAddress; import java.net.UnknownHostException; public class InetAddressExample { public static void main(String[] args) throws UnknownHostException { // 根据主机名获取InetAddress对象 InetAddress address = InetAddress.getByName("www.google.com"); // 输出IP地址和主机名 System.out.println("IP Address: " + address.getHostAddress()); System.out.println("Host Name: " + address.getHostName()); // 检查是否是回环地址 System.out.println("Is Loopback Address: " + address.isLoopbackAddress()); // 检查是否是多播地址 System.out.println("Is Multicast Address: " + address.isMulticastAddress()); } }
运行以上代码,将输出类似以下结果:
IP Address: 142.250.66.100 Host Name: www.google.com Is Loopback Address: false Is Multicast Address: false
5.2Socket类
Socket类是Java中用于实现网络通信的类。它提供了一种在不同计算机之间进行数据传输的机制,通过网络连接进行通信。
Socket类可以用来创建网络连接和进行数据传输。它提供了一系列方法来创建Socket对象、连接到远程服务器、发送和接收数据。
下面是Socket类的一些常用方法:
- 构造方法:
- Socket(String host, int port):创建一个Socket对象并连接到指定的远程服务器的指定端口。
- 连接方法:
- connect(SocketAddress endpoint):连接到指定的远程服务器的指定端口。
- 数据传输方法:
- getInputStream():返回与该Socket对象关联的输入流,用于从远程服务器接收数据。
- getOutputStream():返回与该Socket对象关联的输出流,用于向远程服务器发送数据。
- 关闭方法:
- close():关闭Socket连接。
使用Socket类可以实现客户端和服务器之间的通信。客户端可以使用Socket类创建一个连接到服务器的Socket对象并发送数据,服务器则可以使用Socket类接收客户端发送的数据并进行相应的处理。
总之,Socket类是Java中用于实现网络通信的关键类,通过它可以实现不同计算机之间的数据传输和通信。
5.3Socket类相关API
在Java中,Socket类是用来建立网络连接并进行网络通信的。以下是一些Socket类相关的常用API:
构造函数:
Socket(String host, int port)
:使用指定的主机名和端口号创建一个套接字对象。Socket(InetAddress address, int port)
:使用指定的IP地址和端口号创建一个套接字对象。Socket(String host, int port, InetAddress localAddr, int localPort)
:使用指定的主机名、端口号、本地IP地址和本地端口号创建一个套接字对象。Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
:使用指定的IP地址、端口号、本地IP地址和本地端口号创建一个套接字对象。I/O流:
getInputStream()
:返回套接字的输入流,用于从套接字读取数据。getOutputStream()
:返回套接字的输出流,用于向套接字写入数据。连接相关:
connect(SocketAddress endpoint)
:连接到指定的套接字地址。connect(SocketAddress endpoint, int timeout)
:在指定的超时时间内尝试连接到指定的套接字地址。bind(SocketAddress bindpoint)
:将套接字绑定到指定的本地地址。关闭相关:
close()
:关闭套接字连接。其他:
isConnected()
:检查套接字是否已连接。getInetAddress()
:返回套接字连接的远程IP地址。getPort()
:返回套接字连接的远程端口号。getLocalAddress()
:返回套接字绑定的本地IP地址。getLocalPort()
:返回套接字绑定的本地端口号。这些是Socket类的一些常用API,可以通过阅读Java官方文档来了解更多详细的API和用法
6.通信模型
7.url编程
URL编程是指在网络编程中使用Uniform Resource Locator (URL) 来访问和处理网络资源。URL是一种标识和定位网络资源的方法,它包含了资源的具体位置和访问方式。
在URL编程中,可以使用各种编程语言和框架来处理URL,包括但不限于以下功能:
- 解析URL:将URL字符串解析为其组成部分,例如协议、主机、路径、查询参数等。
- 构建URL:将URL组成部分拼接成完整的URL字符串,包括协议、主机、路径、查询参数等。
- 发送请求:使用HTTP或其他协议发送GET、POST等请求到指定的URL,并获取响应数据。
- 处理URL参数:解析URL中的查询参数,将其用于业务逻辑中的处理。
- URL编码和解码:对URL中的特殊字符进行编码,以避免引起URL解析或传输的问题。
- 重定向和跳转:根据URL的重定向信息或跳转规则,将请求重新定向到其他URL。
- URL验证和安全性:验证URL的有效性、合法性和安全性,以防止恶意URL的使用。
URL编程在Web开发、网络爬虫、API调用等场景中广泛应用。常见的编程语言和框架,例如Python的requests库、Java的HttpURLConnection类、JavaScript的fetch函数等,都提供了相应的URL编程接口和工具来简化URL处理和网络请求的操作。
7.1URL类的实例化以及常用方法
URL类是java.net包中的一个类,用于表示一个统一资源定位符(URL)。URL类的实例化可以通过以下几种方式:
使用字符串创建URL对象:
URL url = new URL("https://www.example.com");
使用已有的URL对象创建新的URL对象:
URL url = new URL("https://www.example.com"); URL newUrl = new URL(url, "page.html");
URL类中常用的方法包括:
String getProtocol()
: 获取URL的协议部分(例如,http、https等)。
String getHost()
: 获取URL的主机名部分。
int getPort()
: 获取URL的端口号部分。
String getPath()
: 获取URL的路径部分。
String getQuery()
: 获取URL的查询字符串部分。
URLConnection openConnection()
: 打开到URL所引用资源的连接,并返回一个URLConnection对象。
InputStream openStream()
: 打开到URL所引用资源的连接,并返回一个输入流,用于读取资源的内容。
void openConnection(Proxy proxy)
: 使用指定的代理服务器打开到URL所引用资源的连接。
boolean equals(Object obj)
: 判断该URL对象是否与指定对象相等。
String toString()
: 返回URL对象的字符串表示。