java-网络编程

发布时间:2026/9/12 20:56:03

java-网络编程 在Java中进行网络通信时使用TCP的方式进行传输TCP在传输时使用字符流进行传输所以我们在java中可以 这样写。在TCP通信过程中网络环境的不稳定、对端异常关闭连接或数据读写超时都可能触发各种异常。常见的异常包括IOException和SocketTimeoutException前者通常表示底层I/O操作失败例如连接被重置、管道破裂或流已关闭后者则是在设置了读取超时时间后指定时间内未收到数据时抛出。正确处理这些异常是保证程序健壮性的关键。对于异常处理推荐使用try-with-resources语法它可以自动关闭实现了AutoCloseable接口的资源简化代码并避免资源泄漏。下面给出一个使用try-with-resources的TCP客户端示例import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.net.SocketTimeoutException; //这里完全可以使用通配符 public class TcpClient { public static void main(String[] args) { String host 127.0.0.1; int port 8080; // try-with-resources 自动关闭 Socket 及相关流 try (Socket socket new Socket(host, port); PrintWriter out new PrintWriter(socket.getOutputStream(), true); BufferedReader in new BufferedReader(new InputStreamReader(socket.getInputStream()))) { // 设置读取超时时间为 3 秒 socket.setSoTimeout(3000); out.println(Hello, Server!); String response in.readLine(); System.out.println(服务器响应: response); } catch (SocketTimeoutException e) { System.err.println(读取超时服务器未在指定时间内响应: e.getMessage()); } catch (IOException e) { System.err.println(TCP通信发生I/O异常: e.getMessage()); } } }如果项目运行在Java 7之前的版本无法使用try-with-resources则需要使用try-catch-finally手动关闭资源。示例如下import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.net.SocketTimeoutException; public class TcpClientOld { public static void main(String[] args) { Socket socket null; PrintWriter out null; BufferedReader in null; try { socket new Socket(127.0.0.1, 8080); out new PrintWriter(socket.getOutputStream(), true); in new BufferedReader(new InputStreamReader(socket.getInputStream())); socket.setSoTimeout(3000); out.println(Hello, Server!); String response in.readLine(); System.out.println(服务器响应: response); } catch (SocketTimeoutException e) { System.err.println(读取超时: e.getMessage()); } catch (IOException e) { System.err.println(TCP通信发生I/O异常: e.getMessage()); } finally { // 在 finally 中逐个关闭资源避免资源泄漏 try { if (in ! null) { in.close(); } } catch (IOException e) { e.printStackTrace(); } try { if (out ! null) { out.close(); } } catch (Exception e) { e.printStackTrace(); } try { if (socket ! null) { socket.close(); } } catch (IOException e) { e.printStackTrace(); } } } }在实际开发中建议优先使用try-with-resources它更简洁且不易遗漏资源关闭同时应根据业务场景合理设置超时时间并对SocketTimeoutException和IOException分别处理以便更精准地定位问题。服务端结束了Clientimport java.io.*; import java.net.*; public class TCPclient { public static void main(String[] args) { String serveradders127.0.0.1; int port8888; try ( Socket socket new Socket(serveradders, port); BufferedReader innew BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter outnew PrintWriter(socket.getOutputStream(),true); BufferedReader fnew BufferedReader(new InputStreamReader(System.in)); ){ System.out.println(已建立链接); String Lint; while(null!(Lintf.readLine())){ out.println(Lint); String reponein.readLine(); System.out.println(返回repone); } } } }用多线程的方式可以做到client-server-client的方式传输import java.io.*; import java.net.Socket; public class client { public static void main(String[] args) throws IOException { String serverAddress 127.0.0.1; int port 8888; try ( Socket socket new Socket(serverAddress, port); BufferedReader in new BufferedReader( new InputStreamReader(socket.getInputStream()) ); PrintWriter out new PrintWriter( socket.getOutputStream(), true ); BufferedReader f new BufferedReader( new InputStreamReader(System.in) ) ) { System.out.println(已建立连接); // 接收线程 Thread receiveThread new Thread(() - { try { String message; while ((message in.readLine()) ! null) { System.out.println(\n对方 message); System.out.print(我); } } catch (IOException e) { System.out.println(连接已断开); } }); receiveThread.start(); // 主线程负责发送 String message; while ((message f.readLine()) ! null) { if (message.equals(exit)) { break; } out.println(message); System.out.print(我); } } } }server:import java.io.*; import java.net.*; import java.util.*; public class server { static ListSocket clients new ArrayList(); public static void main(String[] args) throws IOException { ServerSocket serverSocket new ServerSocket(8888); System.out.println(服务器启动等待客户端连接...); while (true) { Socket socket serverSocket.accept(); System.out.println(客户端连接 socket.getInetAddress()); clients.add(socket); Thread thread new Thread(() - handleClient(socket)); thread.start(); } } static void handleClient(Socket socket) { try { BufferedReader in new BufferedReader( new InputStreamReader(socket.getInputStream()) ); String message; while ((message in.readLine()) ! null) { System.out.println(收到 message); // 转发给其他客户端 for (Socket client : clients) { if (client ! socket) { PrintWriter out new PrintWriter( client.getOutputStream(), true ); out.println(message); } } } } catch (IOException e) { System.out.println(客户端断开); clients.remove(socket); } } }
延伸阅读

更多相关文章

2026/9/12 20:56:03

uv cache prune --ci 是什么?CI 中如何缩小 uv 缓存体积

uv cache prune --ci 是什么?CI 中如何缩小 uv 缓存体积 【免费下载链接】uv An extremely fast Python package and project manager, written in Rust. 项目地址: https://gitcode.com/GitHub_Trending/uv/uv 如果你在 GitHub Actions 或 GitLab CI 中开启…

2026/9/12 20:51:02

cf前端直接上传

之前是后端上传,现在计划改前端直接传。 使用直接创建者上传还无需中间存储桶,也能省去相关的存储/流出成本 参考文档 Presigned URLs Cloudflare R2 docs https://developers.cloudflare.com/r2/api/s3/presigned-urls/ 有php版本sdk https://dev…

2026/9/12 21:56:07

YOLOv5交通标志检测:从数据集到部署的全流程实战解析

简介:基于YOLOv5的交通标志物检测完整项目,主要面向正在准备课程设计、期末大作业的计算机专业学生,以及希望上手目标检测实战的深度学习学习者。项目包含全部开发源码、已经训练完成的权重模型与完整的训练测试数据,环境依赖配置…

2026/9/12 21:56:07

树莓派Pico呼吸灯实战:MicroPython+PWM精准控光

1. 项目概述:为什么一个呼吸灯值得你花20分钟认真对待树莓派 Pico、MicroPython、PWM、LED——这四个词凑在一起,不是教科书里的抽象概念,而是我去年帮朋友调试智能台灯时,真正焊在面包板上、烧进芯片里、肉眼可见亮起来的第一块“…

2026/9/12 21:56:07

YOLOv5交通标志检测:从数据预处理到ONNX部署完整指南

简介:YOLOv5交通标志物检测完整工程包,面向计算机相关专业正在准备课程设计、期末大作业的学生,以及需要完整项目进行实战练习的深度学习学习者。项目以YOLOv5为检测框架,整合了源代码、训练好的权重模型、标注数据与训练配置&…

2026/9/12 21:56:07

Layui按钮级权限控制实战:从权限码设计到前端显隐方案

1. 需求来源与整体设计思路1.1 为什么后台管理系统必须做按钮级权限控制我最早接触layui的时候,其实也不太理解按钮权限这回事。菜单权限好理解,不同角色看到不同菜单,侧边栏渲染出来就不一样。但按钮权限是个更细的维度——同样是“编辑”按…

2026/9/12 21:51:07

Java智慧养老平台代码实战:工单闭环、Redis防抖与高并发优化

简介:一套基于SpringBoot的智慧养老平台完整Java源码,面向计算机、电子信息工程等专业学习者,适合作为毕业设计、课程设计及期末大作业。系统采用B/S架构与MVC模式,整合SpringBoot、Mybatis、Ajax、Vue等技术栈,覆盖前…

2026/9/12 2:05:33

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/12 3:55:12

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/12 10:09:03

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/12 0:04:17

MATLAB仿生优化框架:长鼻浣熊算法多策略融合实现

简介:本资源是一份面向智能优化算法研究者与MATLAB初学者的仿生智能算法实践代码包,聚焦于长鼻浣熊优化算法(COA)的多策略改进与性能验证。针对传统COA易陷局部最优、收敛精度不足等问题,作者融合Circle映射初始化提升…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 JavaWeb 的校园一卡通管理系统的设计与实现 基于 JavaWeb 的校园卡业务管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 Java 的图书馆借阅管理平台的搭建与实现 基于 Java 的图书馆综合管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/12 6:29:36

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/12 14:32:17

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/12 6:37:43

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码