Java基础 (七:网络编程、HTTP客户端开发)(待完善)

本文借鉴这篇文章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,几乎所有现代网络设备都支持。每一层都有对应的协议规范如何通信。

  1. 应用层:浏览器发起 HTTPS 请求(基于 HTTP + SSL/TLS)。
  2. 传输层:使用 TCP 协议建立可靠连接(三次握手)。
  3. 网络层:通过 IP 协议进行路由转发。
  4. 数据链路层:在局域网中通过 Ethernet 传输帧。
  5. 物理层:通过网线或无线信号传输比特流。

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 复制代码
客户端 → 请求 → 服务器 → 响应 → 客户端
  • 客户端发送 GETPOST 等请求。
  • 服务器处理请求并返回状态码和响应体。

HTTPS 流程

text 复制代码
客户端 → TLS 握手 → 加密通信 → 服务器 → 加密响应 → 客户端
  1. TLS 握手:客户端与服务器协商加密算法和交换密钥。
  2. 加密通信:所有数据均以加密形式传输。
  3. 解密响应:客户端解密收到的数据。

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
内置重试
相关推荐
aiopencode3 小时前
iOS WebKit Debug Proxy 深度解析与替代方案,跨平台远程调试的新思路
后端
Java小混子3 小时前
golang项目CRUD示例
开发语言·后端·golang
想搞艺术的程序员3 小时前
Go 优雅关闭实践指南:从原理到框架落地
开发语言·后端·golang
JohnYan3 小时前
Bun技术评估 - 29 Docker集成
javascript·后端·docker
华仔啊3 小时前
MyBatis-Plus 让你开发效率翻倍!新手也能5分钟上手!
java·后端·mybatis
绝无仅有3 小时前
某东互联网大厂的Redis面试知识点分析
后端·面试·架构
乌暮4 小时前
JavaEE入门--计算机是怎么工作的
java·后端·java-ee
前端世界4 小时前
ASP.NET 实战:用 CSS 选择器打造一个可搜索、响应式的书籍管理系统
css·后端·asp.net
Java水解4 小时前
MySQL 正则表达式:REGEXP 和 RLIKE 操作符详解
后端·mysql