本文借鉴这篇文章juejin.cn/post/696196... Java之网络编程
概述
计算机网络 是把不同地理区域的计算机用通信线路连接成一个通信网格系统,从而使的计算机可以方便地传递信息。网络编程是指编写程序使计算机能够通过网络进行通信的技术。它涉及在不同设备间建立连接、传输数据以及处理网络相关的操作。 Java网络编程是指使用Java语言实现计算机之间通过网络进行通信的技术。它主要解决两个核心问题:如何定位网络中的主机,以及如何可靠高效地传输数据。
核心概念
IP地址
- 定义:Internet Protocol Address,是网络中设备的唯一标识符
- IPv4 :32位地址,通常表示为四个十进制数(如
192.168.1.1) - IPv6 :128位地址,用八组十六进制数表示(如
2001:0db8:85a3:0000:0000:8a2e:0370:7334)
端口
- 定义:用于标识设备上特定服务或应用程序的16位数字,在不同端口可以运行计算机的不同服务
- 取值范围:0-65535
- 分类 :
知名端口:0-1023(如HTTP的80端口,HTTPS的443端口)注册端口:1024-49151动态/私有端口:49152-65535
域名
- 定义 :便于人类记忆的网站地址(如
www.example.com) - DNS解析:通过域名系统将域名转换为对应的IP地址
- 层级结构:从右到左分别为顶级域名、二级域名、子域名等
协议
- TCP:传输控制协议,面向连接,提供可靠数据传输
- UDP:用户数据报协议,无连接,传输速度快但不保证可靠性
- HTTP/HTTPS:应用层协议,用于Web通信
如上图所示,有OSI和TCP/IP两种模型分层理解网络通信。虽然 OSI 模型理论完整,但实际网络系统多采用 TCP/IP 模型。相比 OSI 的 7 层,TCP/IP 的 4 层更贴近实际网络实现。互联网标准也基于 TCP/IP,几乎所有现代网络设备都支持。每一层都有对应的协议规范如何通信。
- 实际通信流程示例 以浏览器访问 www.example.com 为例:
- 应用层:浏览器发起 HTTPS 请求(基于 HTTP + SSL/TLS)。
- 传输层:使用 TCP 协议建立可靠连接(三次握手)。
- 网络层:通过 IP 协议进行路由转发。
- 数据链路层:在局域网中通过 Ethernet 传输帧。
- 物理层:通过网线或无线信号传输比特流。
HTTP/HTTPS 协议详解
在编程开发中,HTTP(超文本传输协议)和 HTTPS(安全超文本传输协议)是基础且核心的通信协议,广泛应用于 Web 开发、API 设计、移动应用、微服务架构等场景。在编程开发中经常用到,因此拿出来着重讲一下。
1. 基本概念
HTTP(HyperText Transfer Protocol):超文本传输协议,用于在Web浏览器和服务器之间传输数据。HTTPS(HTTP Secure):基于SSL/TLS加密的HTTP,提供安全的数据传输。
2. 协议特点
HTTP 特点
- 无状态:每次请求独立,服务器不保存客户端状态。
- 明文传输:数据以明文形式发送,存在安全风险。
- 基于请求-响应模型:客户端发起请求,服务器返回响应。
HTTPS 特点
- 加密传输 :使用
SSL/TLS对数据进行加密,防止窃听和篡改。 - 身份验证:通过数字证书验证服务器身份,防止中间人攻击。
- 完整性保护:确保数据在传输过程中未被修改。
3. 协议流程
HTTP 流程
text
客户端 → 请求 → 服务器 → 响应 → 客户端
- 客户端发送
GET或POST等请求。 - 服务器处理请求并返回状态码和响应体。
HTTPS 流程
text
客户端 → TLS 握手 → 加密通信 → 服务器 → 加密响应 → 客户端
- TLS 握手:客户端与服务器协商加密算法和交换密钥。
- 加密通信:所有数据均以加密形式传输。
- 解密响应:客户端解密收到的数据。
4. 常见状态码
| 状态码 | 含义 |
|---|---|
200 |
OK,请求成功 |
301 |
永久重定向 |
302 |
临时重定向 |
400 |
客户端错误 |
401 |
未授权 |
403 |
禁止访问 |
404 |
资源未找到 |
500 |
服务器内部错误 |
5. 在 Java 中的应用
使用 HttpURLConnection
java
URL url = new URL("https://api.example.com/data");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
int responseCode = connection.getResponseCode();
使用 HttpClient(Java 11+)
java
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.example.com/data"))
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
Java网络编程基础
Java通过java.net包提供网络编程支持,包括基于流的通信(如TCP)和基于数据包的通信(如UDP)。例如,TCP/IP协议是互联网通信的基础,Java类库封装了相关功能,便于开发者快速实现网络应用。
Socket编程模型
- ServerSocket: 服务端监听套接字,用于接收客户端连接请求
- Socket: 客户端和服务端之间的通信通道
- InputStream/OutputStream: 用于数据的读写操作
java
// 服务端示例
ServerSocket serverSocket = new ServerSocket(8080);
Socket clientSocket = serverSocket.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
// 客户端示例
Socket socket = new Socket("localhost", 8080);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
TCP vs UDP
- TCP: 面向连接、可靠传输、有序交付
- UDP: 无连接、不可靠传输、高效快速
2. HTTP客户端实现方式
2.1 原生HttpURLConnection
java
URL url = new URL("http://example.com/api");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setRequestProperty("Content-Type", "application/json");
int responseCode = connection.getResponseCode();
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
2.2 Apache HttpClient
java
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpGet request = new HttpGet("http://example.com/api");
request.addHeader("Content-Type", "application/json");
CloseableHttpResponse response = httpClient.execute(request);
2.3 OkHttp客户端
java
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("http://example.com/api")
.addHeader("Content-Type", "application/json")
.build();
Response response = client.newCall(request).execute();
3. 现代HTTP客户端特性
异步请求处理
java
// CompletableFuture异步处理
CompletableFuture.supplyAsync(() -> {
// 执行HTTP请求
return httpClient.send(request, HttpResponse.BodyHandlers.ofString());
}).thenAccept(response -> {
// 处理响应
});
连接池管理
- 连接复用: 减少TCP连接建立开销
- 超时控制: 连接超时、读取超时、写入超时
- SSL/TLS支持: HTTPS安全通信
请求/响应拦截器
java
// 请求拦截器示例
client.interceptors().add(chain -> {
Request request = chain.request().newBuilder()
.addHeader("Authorization", "Bearer " + token)
.build();
return chain.proceed(request);
});
4. 最佳实践
异常处理
- 网络超时异常处理
- 连接异常恢复机制
- 重试策略实现
性能优化
- 合理设置连接池大小
- 启用GZIP压缩
- 使用HTTP/2协议提升性能
安全考虑
- HTTPS证书验证
- 敏感信息加密传输
- 防止SSRF攻击
5. 常用框架对比
| 特性 | HttpURLConnection | Apache HttpClient | OkHttp |
|---|---|---|---|
| 轻量级 | ✓ | ✗ | ✓ |
| 连接池 | ✗ | ✓ | ✓ |
| 异步支持 | ✗ | ✓ | ✓ |
| HTTP/2 | ✗ | ✗ | ✓ |
| 内置重试 | ✗ | ✓ | ✓ |