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
内置重试
相关推荐
红尘散仙27 分钟前
我把终端小说阅读器接上了 AI Agent:TRNovel 现在能用 skill 生成书源了
人工智能·后端·rust
卷毛的技术笔记2 小时前
告别硬编码!Spring AI Alibaba 实现 AI Agent 智能工具调用(Tool Calling)
java·人工智能·后端·python·spring·ai编程
会编程的土豆2 小时前
Go 语言反射(Reflection)详解
开发语言·后端·golang
喵个咪2 小时前
GoWind Toolkit Go后端代码生成 完整全流程实战
后端·go·orm
basketball6163 小时前
Go 语言从入门到进阶:4. 数组和MAP使用方法总结
开发语言·后端·golang
qq_2518364573 小时前
SpringBoot+Vue 共享电池柜管理系统 完整实现 前后端分离项目实战 完整代码
vue.js·spring boot·后端
zhangxingchao3 小时前
AI 大模型核心六:量化、Workflow 与 Agent、多轮 RAG
前端·人工智能·后端
IT_陈寒4 小时前
Vite打包时遇到的坑,原来问题出在这里
前端·人工智能·后端
ayqy贾杰5 小时前
基层管理的三板斧,在AI时代行不通了
前端·后端·团队管理
Apifox5 小时前
Apifox 5 月更新|Postman 导入优化、Runner 支持非 root 运行、请求代码自动带鉴权
前端·后端·安全