作为一名 Java 开发工程师,你一定在实际开发中遇到过需要与远程服务器通信、实现客户端/服务端架构、处理 HTTP 请求、构建分布式系统等场景。这时,Java 网络编程(Java Networking) 就成为你必须掌握的核心技能之一。

Java 提供了丰富的网络编程 API,从底层的 Socket 到高层的 URL、URLConnection、HttpURLConnection,再到现代的 HttpClient(Java 11+)Netty 等,帮助开发者轻松实现网络通信。

本文将带你全面掌握:

  • 网络编程基础(IP、端口、协议、OSI 模型)
  • TCP 与 UDP 的区别与使用场景
  • Java 中的 Socket 编程(TCP/UDP)
  • 基于 HTTP 的网络通信(GET/POST 请求)
  • 使用 URLURLConnectionHttpClient 实现网络请求
  • 多线程网络通信与服务器设计
  • 实战:构建 TCP 服务端/客户端、HTTP 请求处理、聊天程序、远程调用
  • 常见误区与最佳实践

并通过丰富的代码示例和真实项目场景讲解,帮助你写出更高效、更安全、结构更清晰的 Java 网络通信代码。


🧱 一、什么是网络编程?

✅ 网络编程定义:

网络编程是指程序通过网络与其他设备或程序进行数据交换的过程。它是实现分布式系统、客户端/服务端架构、远程通信、微服务等的基础。

✅ 常见术语:

术语描述
IP 地址网络中设备的唯一标识(如:192.168.1.1)
端口号应用程序通信的“门”,0~65535
协议通信双方约定的数据格式和规则(如 TCP、UDP、HTTP)
Socket网络通信的端点,是网络通信的基础
客户端/服务端(C/S)客户端发起请求,服务端响应请求
OSI 七层模型网络通信的分层模型(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层)

🔍 二、TCP 与 UDP 的区别

对比项TCPUDP
是否可靠是(有确认机制)否(无确认)
是否连接是(三次握手)否(无连接)
数据顺序保证顺序不保证顺序
传输效率相对较低
适用场景文件传输、网页请求、数据库通信视频会议、游戏、广播通信
Java 类SocketServerSocketDatagramSocketDatagramPacket

🧠 三、Java 中的网络编程核心类

✅ 1. InetAddress:获取 IP 地址信息

InetAddress address = InetAddress.getByName("www.baidu.com");
System.out.println("IP地址:" + address.getHostAddress());

✅ 2. Socket 和 ServerSocket:TCP 编程核心类

TCP 服务端示例:
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("服务端启动,等待连接...");Socket socket = serverSocket.accept();
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println("收到客户端消息:" + reader.readLine());socket.close();
serverSocket.close();
TCP 客户端示例:
Socket socket = new Socket("127.0.0.1", 8888);
PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
writer.println("Hello Server");
socket.close();

✅ 3. DatagramSocket 和 DatagramPacket:UDP 编程核心类

UDP 接收端示例:
DatagramSocket socket = new DatagramSocket(9999);
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
System.out.println("收到消息:" + new String(packet.getData(), 0, packet.getLength()));
socket.close();
UDP 发送端示例:
DatagramSocket socket = new DatagramSocket();
String msg = "Hello UDP Server";
InetAddress address = InetAddress.getByName("127.0.0.1");
DatagramPacket packet = new DatagramPacket(msg.getBytes(), msg.length(), address, 9999);
socket.send(packet);
socket.close();

✅ 4. URLURLConnection:处理 HTTP 请求

URL url = new URL("https://www.baidu.com");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {System.out.println(line);
}
reader.close();

✅ 5. HttpClient(Java 11+):现代 HTTP 客户端

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder().uri(URI.create("https://www.baidu.com")).build();HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());

🧪 四、网络编程实战应用场景

场景1:构建 TCP 聊天程序(多线程)

// 服务端
new Thread(() -> {try (ServerSocket serverSocket = new ServerSocket(8888)) {while (true) {Socket socket = serverSocket.accept();new Thread(() -> {try (BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {String line;while ((line = reader.readLine()) != null) {System.out.println("收到消息:" + line);}} catch (IOException e) {e.printStackTrace();}}).start();}} catch (IOException e) {e.printStackTrace();}
}).start();// 客户端
Socket socket = new Socket("127.0.0.1", 8888);
PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
writer.println("你好,服务器!");

场景2:模拟 HTTP 请求发送数据(如登录)

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder().uri(URI.create("https://example.com/login")).header("Content-Type", "application/x-www-form-urlencoded").POST(HttpRequest.BodyPublishers.ofString("username=admin&password=123456")).build();HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println("响应码:" + response.statusCode());
System.out.println("响应内容:" + response.body());

场景3:实现远程调用(RPC)基础框架

// 客户端发送方法调用
Socket socket = new Socket("127.0.0.1", 8888);
ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
out.writeObject(new RpcRequest("sayHello", new Object[]{"Java"}));// 服务端接收请求并处理
ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
RpcRequest request = (RpcRequest) in.readObject();
Object result = invoke(request);
ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
out.writeObject(result);

🧱 五、网络编程最佳实践

实践描述
显式关闭网络资源使用 try-with-resources 或 finally 块关闭 socket、流
设置超时时间避免长时间阻塞,如 socket.setSoTimeout(3000)
使用多线程处理并发请求服务端应为每个连接创建新线程或使用线程池
使用缓冲流提高效率如 BufferedReaderBufferedWriter
使用协议封装通信数据自定义协议头、长度、内容,避免粘包
使用 JSON 或 XML 传输结构化数据更易维护、兼容性强
使用日志记录网络通信方便排查问题
使用异常处理机制捕获 IOExceptionUnknownHostException 等
使用 NIO 提升性能如 java.nio.channels.SocketChannel
使用 Netty 构建高性能网络应用更高级的网络通信框架

🚫 六、常见误区与注意事项

误区正确做法
忘记关闭 socket使用 try-with-resources 自动关闭
不设置超时导致程序挂起,应设置连接和读取超时
不处理异常必须捕获并处理网络异常
不使用缓冲流导致频繁 IO 操作,效率低
忽略协议设计导致粘包、拆包问题,应设计协议头
使用字节流直接转字符串应使用 InputStreamReader 指定编码
忽略并发处理服务端应支持多线程或 NIO
不使用日志记录通信难以排查问题,应记录请求和响应
使用 InetAddress.getLocalHost() 获取公网 IP应使用第三方服务获取公网 IP
不使用 JSON/XML 传输数据应结构化传输,避免字符串拼接

📊 七、总结:Java 网络编程核心知识点一览表

内容说明
网络编程基础IP、端口、协议、TCP/UDP
Java 网络类Socket、ServerSocket、DatagramSocket、URL、HttpClient
TCP 编程客户端/服务端模型,多线程处理
UDP 编程无连接通信,适合广播和实时传输
HTTP 请求使用 URLConnection、HttpClient 实现
实际应用聊天程序、远程调用、HTTP 请求、网络爬虫
最佳实践显式关闭资源、设置超时、多线程、协议设计
注意事项避免粘包、异常处理、日志记录

📎 八、附录:Java 网络编程常用技巧速查表

技巧示例
获取本机 IP 地址InetAddress.getLocalHost().getHostAddress()
获取网页 HTML 内容new URL("https://www.baidu.com").openStream()
发送 POST 请求HttpClient + HttpRequest.BodyPublishers.ofString()
设置连接超时socket.setSoTimeout(5000)
使用缓冲流new BufferedReader(new InputStreamReader(...))
发送 JSON 数据HttpRequest.BodyPublishers.ofString(json)
解析响应 JSON使用 Jackson 或 Gson
使用线程池处理客户端连接ExecutorService 处理每个 socket 连接
使用 Netty 构建高性能网络应用NettyServerBootstrap
使用 NIO 实现非阻塞通信Selector + SocketChannel

如果你希望系统回顾 Java 网络编程的核心知识与实战技巧,这篇文章将为你提供完整的知识体系和实用的编程技巧。

欢迎点赞、收藏、转发,也欢迎留言交流你在实际项目中遇到的网络编程相关问题。我们下期再见 👋

📌 关注我,获取更多Java核心技术深度解析!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/92853.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/92853.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/92853.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java面试题(中等)

1. 计算机网络传输层有哪些协议&#xff1f;分别适用于什么场景&#xff1f;TCP协议(传输控制协议)​&#xff1a;面向连接、可靠传输&#xff0c;流量控制、拥塞控制。适用于要求数据完整性的场景&#xff0c;如文件传输、网页浏览、电子邮件等。UDP协议 (用户数据报协议)​&a…

Apache 消息队列分布式架构与原理

消息队列 基本概念 定义 消息队列&#xff08;Message Queue, MQ&#xff09;是一种分布式中间件&#xff0c;通过异步通信、消息暂存和解耦生产消费双方的机制&#xff0c;提供消息的顺序性保证、可靠投递和流量控制能力&#xff0c;广泛应用于微服务解耦、大数据流处理等场景…

ModernBERT如何突破BERT局限?情感分析全流程解析

自2018年推出以来&#xff0c;BERT 彻底改变了自然语言处理领域。它在情感分析、问答、语言推理等任务中表现优异。借助双向训练和基于Transformer的自注意力机制&#xff0c;BERT 开创了理解文本中单词关系的新范式。然而&#xff0c;尽管成绩斐然&#xff0c;BERT 仍存在局限…

股票Level2逐笔成交及十档订单簿分钟级Tick历史行情数据详细解析

本地股票数据处理与分析实战指南 在量化投资与金融数据分析领域&#xff0c;高效处理本地存储的股票数据是核心能力之一。本文将从数据类型定义、解析流程及实际应用角度&#xff0c;系统介绍如何基于CSV文件管理股票分钟数据、高频Tick数据、逐笔数据、Level2历史行情等多样化…

面向互联网2C业务的分布式类Manus Java框架

本文介绍了阿里巴巴推出的分布式类ManusAgent框架——ali-langengine-dflow&#xff0c;旨在解决现有Agent架构在互联网2C业务场景中的局限性。文章从背景出发&#xff0c;分析了当前主流Agent架构&#xff08;如Manus、字节TARS、AutoGLM&#xff09;存在的问题&#xff0c;如…

Java-82 深入浅出 MySQL 内部架构:服务层、存储引擎与文件系统全覆盖

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; AI炼丹日志-30-新发布【1T 万亿】参数量大模型&#xff01;Kim…

开发避坑短篇(6):Vue+Element UI 深度选择器实现表单元素精准对齐的技术实践

需求 el-form 表单的el-input和el-select默认宽度度不一致&#xff0c;导致不对齐&#xff0c;如下图。那么如何设置让el-input和el-select的宽度度一致并对齐&#xff1f;<el-form class"page-form" :model"addForm" :rules"rules" :disable…

rust-参考与借用

参考与借用 在清单4-5中的元组代码的问题在于&#xff0c;我们必须将String返回给调用函数&#xff0c;这样我们才能在调用calculate_length之后继续使用String&#xff0c;因为String已经被移动到了calculate_length中。相反&#xff0c;我们可以提供一个对String值的引用。引…

深入解析HDFS Federation:如何有效解决单NameNode瓶颈问题

HDFS Federation简介与背景在Hadoop分布式文件系统&#xff08;HDFS&#xff09;的经典架构中&#xff0c;NameNode作为核心组件承担着整个文件系统的元数据管理职责。这一设计虽然简洁高效&#xff0c;但随着数据规模的爆炸式增长&#xff0c;单NameNode架构逐渐暴露出难以克服…

为什么选择EasyGBS?

作为集 算法仓、算力设备接入、视频云平台 于一体的综合性智能安防监控平台&#xff0c;EasyGBS有哪些优势是您的必选理由呢&#xff1f;一、设备与协议的兼容性EasyGBS不挑设备品牌型号。只要支持GB28181、RTSP、ONVIF、RTMP标准协议里的任一种&#xff0c;就能将视频接入。但…

【形态学变换】——图像预处理(OpenCV)

目录 1 核 2 腐蚀 3 膨胀 4 开运算 5 闭运算 6 礼帽运算 7 黑帽运算 8 形态学梯度 形态学变换是一种基于形状的简单变换&#xff0c;处理对象是二值化后的图像。有两个输入&#xff1a;原图像和核&#xff0c;一个输出&#xff1a;形态学变换后的图像。基本操作有以下四…

一次“非法指令”(SIGILL)问题的完整调试过程:CPU指令集兼容性探秘

一次"非法指令"问题的完整调试过程&#xff1a;CPU指令集兼容性探秘一、问题概述二、问题现象与初步分析1. 环境与现象2. 官方文档的线索3. 重现问题4. 怀疑方向&#xff1a;CPU指令兼容性5. 关键发现&#xff1a;AVX512指令三、详细调试过程1. 搭建调试环境 (KVM虚拟…

Node.js - 创建 Express 项目

创建 Express 项目 安装 npm i -g express-generatorornpm i -g express-generator4# 注意&#xff1a;Windows有可能碰到提示&#xff1a;npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1&#xff0c;因为在此系统上禁止运行脚本。 # 如果碰到这个错误&#xff0c;需要…

高并发系统设计面试题

高并发系统设计面试题&#x1f525;&#x1f525;&#x1f525; 超高频问题&#xff08;几乎必问&#xff09;让你设计一个秒杀系统&#xff0c;你会考虑哪些问题&#xff1f;如果你的业务量突然提升100倍QPS你会怎么做&#xff1f;库存扣减如何避免超卖和少卖&#xff1f;订单…

【通识】如何看电路图

1. 电路图 1.1 基础概念 电路图即电原理图。 电路图第一种是说明模拟电子电路工作原理&#xff0c;用图形符号表示电阻器、电容器、开关、晶体管等实物&#xff0c;用线条把元器件和单元电路按工作原理的关系连接起来。 第二种则是说明数字电子电路工作原理的。用图形符号表示…

SpringBoot实战指南:从快速入门到生产级部署(2025最新版)

一、为什么SpringBoot依然是Java开发的首选&#xff1f; SpringBoot自2014年发布以来&#xff0c;已成为Java企业级开发的事实标准框架。根据2025年最新调研数据显示&#xff0c;全球78%的Java微服务项目基于SpringBoot构建&#xff0c;其核心优势在于&#xff1a; 约定优于配置…

新房装修是中央空调还是壁挂空调好?

这个要看户型和投资金额&#xff0c;大户型空间适合装中央空调&#xff0c;因为空间大有足够的地方安装&#xff0c;功率也可以根据面积大小进行配置&#xff0c;整体配置一个外机就行了&#xff0c;整体的装修效果比较规整&#xff0c;就是多花点&#xff0c;使用成本也稍高点…

如何理解泊松分布

文章目录一、引例——鲸鱼研究二、泊松分布一、引例——鲸鱼研究 有生态学家对生活在北冰洋水域的鲸鱼进行了跟踪研究&#xff0c;他们利用一台水下无人机来探测鲸鱼数量&#xff0c;这是近十天的数据&#xff1a; 第1天第2天第3天第4天第5天第6天第7天第8天第9天第10天10101…

python学习DAY22打卡

作业&#xff1a; 自行学习参考如何使用kaggle平台&#xff0c;写下使用注意点&#xff0c;并对下述比赛提交代码 kaggle泰坦尼克号人员生还预测 import warnings warnings.filterwarnings("ignore") #忽略警告信息 # 数据处理清洗包 import pandas as pd import …

在 Ansys CFX Pre 中配置 RGP 表的分步指南

掌握在 Ansys CFX Pre 中设置 RGP 表的技巧&#xff0c;以优化仿真精度和效率。挑战在计算流体动力学 &#xff08;CFD&#xff09; 领域&#xff0c;RGP&#xff08;真实气体属性&#xff09;表对于准确模拟流体在不同条件下的行为至关重要。这些表格提供了详细的热力学属性&a…