Java 网络编程详解

news/2025/10/20 9:12:09/文章来源:https://www.cnblogs.com/codingkf/p/19151770

Java 网络编程详解

Java 网络编程是指通过 Java 语言实现计算机之间的网络通信,核心是利用 Java 提供的网络类库(如 java.net 包)操作 TCP/IP 协议,实现数据的发送与接收。无论是客户端与服务器的通信、分布式系统交互,还是网络爬虫等场景,都依赖于网络编程的基础能力。本文将从核心概念、TCP/UDP 编程、高层协议应用到 NIO 进阶,全面解析 Java 网络编程。

一、网络编程基础概念

在开始代码实现前,需先理解几个核心概念,它们是网络通信的 “语言规则”:
 
  • IP 地址:标识网络中唯一的计算机(如 192.168.1.1 或 www.baidu.com,域名会通过 DNS 解析为 IP)。
  • 端口号:标识计算机中运行的某个进程(范围 0-65535,0-1023 为系统端口,如 HTTP 默认 80,建议使用 1024+ 避免冲突)。
  • 协议:通信双方的规则约定,Java 网络编程主要基于 TCP 和 UDP 协议:
    • TCP:面向连接的可靠协议(三次握手建立连接,四次挥手断开),数据传输有序、不丢失(适合文件传输、登录等)。
    • UDP:无连接的不可靠协议(数据以 “数据报” 形式发送,可能丢失或乱序),但速度快(适合视频通话、实时游戏等)。

二、核心类库:Java 网络编程的 “工具包”

Java 的 java.net 包提供了丰富的类,简化了网络通信的实现。核心类如下:
 
类 / 接口作用适用协议
InetAddress 表示 IP 地址(支持域名解析) 通用
Socket 客户端 TCP 套接字(建立连接、传输数据) TCP
ServerSocket 服务器端 TCP 套接字(监听连接、接收请求) TCP
DatagramSocket UDP 套接字(发送 / 接收数据报) UDP
DatagramPacket UDP 数据报(封装数据、目标地址和端口) UDP
URL / URLConnection 处理高层协议(如 HTTP、FTP) 应用层协议

三、TCP 编程:可靠的连接式通信

TCP 通信需先建立连接(类似打电话 “接通”),再传输数据,最后断开连接。核心流程是 “服务器端监听 → 客户端连接 → 双向通信 → 关闭连接”。

1. TCP 服务器端实现

服务器端需绑定端口并监听客户端连接,每接收到一个连接,通过输入流读取数据,输出流发送响应。
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;public class TCPServer {public static void main(String[] args) throws IOException {// 1. 创建 ServerSocket,绑定端口(如 8888)ServerSocket serverSocket = new ServerSocket(8888);System.out.println("服务器启动,监听端口 8888...");// 2. 循环监听客户端连接(实际开发中用多线程处理多个客户端)while (true) {// 阻塞等待客户端连接(建立 TCP 三次握手)Socket clientSocket = serverSocket.accept();System.out.println("客户端 " + clientSocket.getInetAddress() + " 已连接");// 3. 获取输入流(读客户端数据)和输出流(向客户端写数据)try (BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));PrintWriter out = new PrintWriter(new OutputStreamWriter(clientSocket.getOutputStream()), true)) {// 4. 读取客户端消息String clientMsg;while ((clientMsg = in.readLine()) != null) {System.out.println("收到客户端消息:" + clientMsg);// 5. 向客户端发送响应out.println("服务器已收到:" + clientMsg);// 若客户端发送 "exit",断开连接if ("exit".equals(clientMsg)) {break;}}} catch (IOException e) {e.printStackTrace();} finally {// 6. 关闭客户端连接clientSocket.close();System.out.println("客户端 " + clientSocket.getInetAddress() + " 已断开");}}}
}
 

2. TCP 客户端实现

客户端需指定服务器 IP 和端口,建立连接后,通过输出流发送数据,输入流接收响应。
 
 
import java.io.*;
import java.net.Socket;
import java.util.Scanner;public class TCPClient {public static void main(String[] args) throws IOException {// 1. 创建 Socket,连接服务器(IP 为本地 localhost,端口 8888)Socket socket = new Socket("localhost", 8888);System.out.println("已连接服务器");// 2. 获取输入流(读服务器响应)和输出流(向服务器发数据)try (BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true);Scanner scanner = new Scanner(System.in)) {// 3. 循环发送消息给服务器String msg;while (true) {System.out.print("请输入消息(输入 exit 退出):");msg = scanner.nextLine();// 发送消息out.println(msg);// 若输入 exit,退出循环if ("exit".equals(msg)) {break;}// 4. 接收服务器响应String serverMsg = in.readLine();System.out.println("服务器响应:" + serverMsg);}} catch (IOException e) {e.printStackTrace();} finally {// 5. 关闭连接socket.close();System.out.println("已断开与服务器的连接");}}
}
 

3. 关键说明

  • 多线程处理:上述服务器只能处理一个客户端,实际开发中需为每个 clientSocket 启动一个线程(或用线程池),避免阻塞。
  • 流的关闭:使用 try-with-resources 自动关闭流和套接字,避免资源泄露。
  • 数据传输格式:示例用 readLine() 按行读取,需确保客户端和服务器端统一格式(如换行符),复杂场景可使用 JSON 等序列化格式。

四、UDP 编程:高效的无连接通信

UDP 通信无需建立连接,数据以 “数据报” 形式发送,发送方和接收方通过数据报交互(类似发短信,无需对方 “接通”)。

1. UDP 服务器端实现

服务器端通过 DatagramSocket 接收数据报,解析数据后发送响应数据报。
 
import java.net.*;
import java.nio.charset.StandardCharsets;public class UDPServer {public static void main(String[] args) throws SocketException {// 1. 创建 DatagramSocket,绑定端口 9999DatagramSocket socket = new DatagramSocket(9999);System.out.println("UDP 服务器启动,监听端口 9999...");// 2. 创建缓冲区接收数据(大小根据实际需求设置,如 1024 字节)byte[] buffer = new byte[1024];DatagramPacket receivePacket = new DatagramPacket(buffer, buffer.length);while (true) {try {// 3. 阻塞接收数据报(无连接,无需“等待连接”)socket.receive(receivePacket);// 解析数据String clientMsg = new String(receivePacket.getData(), 0, receivePacket.getLength(),StandardCharsets.UTF_8);System.out.println("收到客户端 " + receivePacket.getAddress() + " 消息:" + clientMsg);// 4. 准备响应数据String response = "UDP 服务器已收到:" + clientMsg;byte[] responseData = response.getBytes(StandardCharsets.UTF_8);// 创建响应数据报(包含数据、长度、客户端地址和端口)DatagramPacket sendPacket = new DatagramPacket(responseData, responseData.length,receivePacket.getAddress(), receivePacket.getPort());// 发送响应socket.send(sendPacket);// 若客户端发送 "exit",退出循环if ("exit".equals(clientMsg)) {break;}} catch (Exception e) {e.printStackTrace();}}// 关闭 socketsocket.close();}
}
 

2. UDP 客户端实现

客户端创建数据报,指定服务器地址和端口,发送数据后等待响应。
 
import java.net.*;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;public class UDPClient {public static void main(String[] args) throws SocketException {// 1. 创建 DatagramSocket(客户端无需绑定固定端口,系统自动分配)DatagramSocket socket = new DatagramSocket();// 服务器地址和端口InetAddress serverAddr;try {serverAddr = InetAddress.getByName("localhost");} catch (UnknownHostException e) {throw new RuntimeException("服务器地址解析失败", e);}int serverPort = 9999;Scanner scanner = new Scanner(System.in);while (true) {try {// 2. 输入消息并创建数据报System.out.print("请输入消息(输入 exit 退出):");String msg = scanner.nextLine();byte[] data = msg.getBytes(StandardCharsets.UTF_8);DatagramPacket sendPacket = new DatagramPacket(data, data.length, serverAddr, serverPort);// 3. 发送数据报socket.send(sendPacket);// 4. 接收服务器响应byte[] buffer = new byte[1024];DatagramPacket receivePacket = new DatagramPacket(buffer, buffer.length);socket.receive(receivePacket);String serverMsg = new String(receivePacket.getData(), 0, receivePacket.getLength(),StandardCharsets.UTF_8);System.out.println("服务器响应:" + serverMsg);if ("exit".equals(msg)) {break;}} catch (Exception e) {e.printStackTrace();}}// 关闭 socketsocket.close();scanner.close();}
}
 

3. 关键说明

  • 不可靠性:UDP 不保证数据一定到达,也不保证顺序,需在应用层实现重传、校验等机制(如实时游戏中丢一帧数据不影响体验)。
  • 数据报大小DatagramPacket 缓冲区大小限制单次传输数据量(通常不超过 64KB),大文件传输需拆分数据报。

五、高层协议应用:URL 与 HTTP 通信

除了底层 TCP/UDP,Java 还提供 URL 和 URLConnection 类,简化 HTTP 等高层协议的操作(如爬取网页、调用 API)。

示例:通过 HTTP 访问网页内容

 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;public class HttpDemo {public static void main(String[] args) {try {// 1. 创建 URL 对象(指定网页地址)URL url = new URL("https://www.baidu.com");// 2. 打开连接(默认是 HTTP 连接)URLConnection connection = url.openConnection();// 设置请求头(模拟浏览器,避免被服务器拒绝)connection.setRequestProperty("User-Agent", "Mozilla/5.0");// 3. 获取输入流,读取网页内容try (BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()))) {String line;StringBuilder content = new StringBuilder();while ((line = in.readLine()) != null) {content.append(line).append("\n");}System.out.println("网页内容:\n" + content.toString());}} catch (IOException e) {e.printStackTrace();}}
}
 
 
  • 扩展:复杂 HTTP 操作(如 POST 请求、带参数、Cookie 管理)可使用 HttpURLConnection 或第三方库(如 OkHttp、HttpClient)。

六、进阶:NIO 非阻塞网络编程

传统的 BIO(阻塞 IO)在高并发场景下效率低(一个连接一个线程),Java NIO(New IO,JDK 1.4+)通过 非阻塞 IO 和 多路复用 提升性能,核心组件:
 
  • Channel:双向通道(类似流,但可异步读写),如 SocketChannel(TCP)、DatagramChannel(UDP)。
  • Buffer:数据容器(Channel 只能通过 Buffer 读写数据)。
  • Selector:多路复用器,一个线程可管理多个 Channel(监听读写事件)。

NIO 服务器简单示例(TCP)

 
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.util.Iterator;
import java.util.Set;public class NIOServer {public static void main(String[] args) throws IOException {// 1. 创建 ServerSocketChannel 并绑定端口ServerSocketChannel serverChannel = ServerSocketChannel.open();serverChannel.socket().bind(new InetSocketAddress(8888));serverChannel.configureBlocking(false); // 设置为非阻塞// 2. 创建 Selector 并注册 ServerSocketChannel(监听 ACCEPT 事件)Selector selector = Selector.open();serverChannel.register(selector, SelectionKey.OP_ACCEPT);System.out.println("NIO 服务器启动,监听端口 8888...");while (true) {// 3. 阻塞等待事件(0 表示不阻塞,>0 表示超时时间毫秒)selector.select();// 获取所有就绪事件Set<SelectionKey> selectedKeys = selector.selectedKeys();Iterator<SelectionKey> iterator = selectedKeys.iterator();while (iterator.hasNext()) {SelectionKey key = iterator.next();// 处理事件后移除,避免重复处理iterator.remove();if (key.isAcceptable()) {// 4. 处理连接事件(客户端连接)ServerSocketChannel server = (ServerSocketChannel) key.channel();SocketChannel clientChannel = server.accept();clientChannel.configureBlocking(false); // 客户端通道也设为非阻塞// 注册客户端通道到 Selector,监听 READ 事件clientChannel.register(selector, SelectionKey.OP_READ, ByteBuffer.allocate(1024));System.out.println("客户端 " + clientChannel.getRemoteAddress() + " 连接");} else if (key.isReadable()) {// 5. 处理读事件(客户端发送数据)SocketChannel clientChannel = (SocketChannel) key.channel();ByteBuffer buffer = (ByteBuffer) key.attachment();int bytesRead = clientChannel.read(buffer);if (bytesRead > 0) {buffer.flip(); // 切换为读模式String msg = new String(buffer.array(), 0, bytesRead);System.out.println("收到消息:" + msg);// 简单响应buffer.clear();buffer.put(("NIO 服务器收到:" + msg).getBytes());buffer.flip();clientChannel.write(buffer);} else if (bytesRead == -1) {// 客户端断开连接clientChannel.close();System.out.println("客户端断开连接");}}}}}
}
 
 
NIO 适合高并发场景(如服务器同时处理数千个连接),但编程复杂度高于 BIO,实际开发中常用 Netty 等 NIO 框架简化操作。

七、常见问题与最佳实践

  1. 端口占用:启动服务器时若报 Address already in use,说明端口被占用,可换端口或用 netstat -ano | findstr 端口号 查找占用进程并关闭。
  2. 异常处理:网络操作可能抛出 IOException(如连接超时、断开),需捕获并处理(如重试、关闭资源)。
  3. 资源释放SocketServerSocketDatagramSocket 等实现了 AutoCloseable,优先使用 try-with-resources 自动关闭。
  4. 协议选择:需要可靠传输(如文件、登录)用 TCP;追求速度(如实时数据)用 UDP。
  5. 高并发优化:BIO 适合连接少的场景,NIO/Netty 适合高并发,避免手动创建大量线程(用线程池控制资源)。

总结

Java 网络编程基于 TCP/IP 协议,通过 java.net 包提供的类实现通信:
 
  • TCP:用 Socket 和 ServerSocket 实现可靠连接,适合需要数据完整性的场景。
  • UDP:用 DatagramSocket 和 DatagramPacket 实现无连接通信,适合高效实时场景。
  • 高层协议URL/URLConnection 简化 HTTP 等应用层协议操作。
  • 进阶:NIO 非阻塞模型提升高并发性能,配合框架(如 Netty)可快速开发高性能网络应用。

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

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

相关文章

Office365破解版下载(附永久激活密钥) 及安装使用教程

Office365破解版下载(附永久激活密钥) 及安装使用教程Office 365 是一套集成了 Word、Excel、PowerPoint、Teams、OneDrive 等工具的生产力套件,通过云服务实现高效协作与智能办公。以下是实用技巧,助你提升工作效率…

【URP】Unity中Mipmap Streaming原理与实现

摘要: Unity URP的纹理流送技术通过动态加载纹理的Mipmap层级优化显存使用。传统Mipmap会预加载所有层级(占用显存为原始纹理的4/3倍),而流送技术根据物体与摄像机的距离,仅加载当前所需的层级,其他层级按需异步…

如何设计PAD ring?

流程: 1)根据系统(其他芯片的)要求,芯片内部的floorplan,决定信号PAD的位置 2)计算出power PAD的个数,插入到信号PAD里面 3)加其他的PAD,比如IO filler,power cut,power on control,corner PAD,ESD等 细…

2025 年钢结构源头厂家最新推荐排行榜:聚焦美标欧标 / 环保设备 / 厂房别墅等多领域优质供应商,精选优质厂家助力企业精准选材

引言在当前钢结构行业快速发展的背景下,市场需求不断攀升,但行业乱象也随之凸显。部分企业资质不全却违规承接项目,导致工程质量与安全隐患;有些企业缺乏核心技术,产品性能不稳定,难以满足美标、欧标等高标准要求…

PostgreSQL 18 中国贡献者经验分享:开源参与的四点建议

2025 年 9 月 25 日,PostgreSQL 18 正式发布。该版本不仅修复了上百个问题,更带来了多项颠覆性的功能升级,例如全新的异步 I/O(AIO)框架、新增的跳跃式扫描(SKIP SCAN)技术,以及原生 UUIDv7 支持等,每一项升级…

C#实现连续语音转文字

一、基础实现方案(System.Speech) 1. 环境配置 // 安装NuGet包 Install-Package System.Speech// 添加语言包(控制面板) 控制面板 -> 语言 -> 添加中文语音包2. 核心代码实现 using System.Speech.Recogniti…

2025 年铝门窗厂家推荐排行榜,系统 / 智能 / 断桥 / 窄边 / 定制 / 全景 / 阳光房 / 隐框 / 隔声 / 防火铝门窗公司推荐

引言当前铝门窗市场需求攀升,但行业乱象凸显。部分小型厂家生产体系不完善,产品材质不达标、工艺粗糙,耐用性差;多数企业创新不足,产品同质化严重,难以满足消费者个性化需求;且不少品牌售后体系缺失,消费者维权…

如何把研究性学习糊弄过去

学校搞了个研究性学习,目测是计入综评分还是什么东西。课题只能从它给的内容里选,很地狱。 发现了一个识别手写数字的东西,这不是我们伟大的工程题吗!于是开始思考如何糊弄过去。 咕咕咕。

2025 年碳晶板厂家最新推荐榜:涵盖木纹 / 白色 / 全屋整装等品类,西南及全国优质品牌甄选指南

引言随着碳晶板在墙面装饰、全屋整装等领域应用愈发广泛,市场需求持续攀升,但行业乱象也随之凸显。部分品牌以次充好,用劣质基材降低成本,导致产品强度不足、耐候性差,甚至存在安全隐患;新品牌涌入后产品同质化严…

2025 年干细胞服务机构最新推荐排行榜:聚焦三体系认证与专利技术,精选优质机构供选择

引言当前干细胞技术在健康管理、疾病干预等领域应用愈发广泛,但行业乱象却让消费者难以抉择。部分机构缺乏规范制备流程,质量管理体系缺失,细胞产品安全与有效性无保障;一些机构研发能力薄弱,仅靠基础存储业务,无…

2025 最新隔音棉生产厂家口碑推荐榜:甄选家装公装专用材质,含西南 / 昆明阻尼片 / 吊顶 / 止震板品牌最新推荐

引言随着建筑声学需求升级,隔音棉已成为酒店、KTV、住宅等场景的刚需材料,但市场乱象让采购者举步维艰:部分产品隔音量虚标、防火等级不达标,潮湿环境易发霉老化;中小品牌交付延迟、售后缺位,公装项目常因材料问…

2025 灭老鼠公司最新推荐榜:欧盟认证技术加持,环保服务双优品牌权威甄选指南

引言后疫情时代,有害生物防制需求持续攀升,但鼠患治理市场乱象丛生:部分机构依赖低效化学药剂导致残留污染,通用化方案引发鼠患反复,应急响应滞后让家庭与企业蒙受额外损失,尤其餐饮、医疗等特殊场景更面临合规风…

2025 最新推荐!全国除甲醛公司权威榜单发布,解析蓉皓等标杆企业技术服务优势,覆盖新房 / 办公 / 学校多场景

引言据中国室内环境监测工作委员会数据,我国新装修住宅甲醛超标率居高不下,因治理不当引发的健康纠纷逐年上升。当前除甲醛市场品牌繁杂,部分企业缺乏甲级资质,使用的药剂未达环保标准,不仅除醛效果差,还易造成二…

KingbaseES V8R6清理冗余历史rman备份

KingbaseES V8R6清理冗余历史rman备份对于KingbaseES V8R6的通过sys_rman执行的物理历史备份,可以在执行备份时,备份的保留(retention)策略自动清理。不能通过手工删除备份,可以通过expire参数手工清理历史的冗余…

上周热点回顾(10.13

热点随笔:史诗级漏洞警报:ASP.NET Core 被曝 CVSS 9.9 分漏洞,几乎所有.NET 版本无一幸免! (马行空的博客) 每天10分钟,混剪视频Agent产出50条爆款,单月变现6位数(喂饭级教程) (AI架构师汤师爷) .NET 10 Rel…

一文读懂零知识证明Plonk 协议

下面是一篇专为“小白”准备的 Plonk 通俗科普,目标是让你 5 分钟内知道它到底在干什么、厉害在哪里,以及它背后的“魔法”到底是哪一招。一、先讲个故事:不泄密又能让人相信你 小明自称会瞬间移动,但不想把秘诀告…

P14259 兄妹(siblings)题解

闲话:这似乎是我第一次在 luogu 场切绿。蒟蒻对思维题不太擅长 QwQ。 前置芝士动态规划 / DP子集划分问题 / 可行性背包思路 首先观察这个放书的性质。结论:对于在同一个书架上的书,只需要一个人去负责。 证明也比较…

2025 年国内连接器厂家经销商最新推荐榜:聚焦优质品牌,助力企业精准采购,实力企业深度解析住友/日端/HRS连接器经销商推荐

引言在电子制造行业高速发展的背景下,连接器作为核心部件,其品质与供应效率直接关乎企业生产进度与产品质量。当前市场中,连接器供应商数量繁杂,产品质量参差不齐,“多品种、小批量、短交期” 的采购痛点让众多企…

2025.10.19 零试

大荒囚天指 吸取教训前一天不打 ABC 了。 这次零试拖了两个月才办出来,然后女丘初试和零试并在一起了。属于是之前也没有参考数据的东西。 前一天中午出发之前开了一把绝巴。进塔之后互架了几分钟发现塔里是两对一样配…