Java 之网络编程小案例
1. 多发多收
描述: 编写一个简单的聊天程序,客户端可以向服务器发送多条消息,服务器可以接收所有消息并回复。
代码示例:
服务器端 (Server.java):
import java.io.*;
import java.net.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class Server {public static void main(String[] args) throws IOException {// 创建 ServerSocket 对象,监听指定端口ServerSocket serverSocket = new ServerSocket(8080);System.out.println("服务器启动,监听端口 8080");// 创建线程池,处理多个客户端连接ExecutorService executor = Executors.newFixedThreadPool(10);while (true) {// 阻塞等待客户端连接Socket socket = serverSocket.accept();System.out.println("客户端连接成功: " + socket.getInetAddress().getHostAddress());// 创建线程处理客户端连接executor.execute(new ClientHandler(socket));}}// 处理客户端连接的线程类static class ClientHandler implements Runnable {private Socket socket;public ClientHandler(Socket socket) {this.socket = socket;}@Overridepublic void run() {try (BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));PrintWriter out = new PrintWriter(socket.getOutputStream(), true)) {String message;while ((message = in.readLine()) != null) {System.out.println("收到客户端消息: " + message);out.println("服务器回复: " + message);}} catch (IOException e) {e.printStackTrace();}}}
}
客户端 (Client.java):
import java.io.*;
import java.net.*;public class Client {public static void main(String[] args) throws IOException {// 创建 Socket 对象,连接服务器Socket socket = new Socket("127.0.0.1", 8080);// 获取输入流和输出流BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));PrintWriter out = new PrintWriter(socket.getOutputStream(), true);// 发送多条消息for (int i = 1; i <= 5; i++) {out.println("客户端消息 " + i);System.out.println("发送消息: " + "客户端消息 " + i);// 接收服务器回复String response = in.readLine();System.out.println("接收回复: " + response);}// 关闭连接socket.close();}
}
运行步骤:
-
运行 Server.java,启动服务器。
-
运行 Client.java,启动客户端。
-
客户端会发送 5 条消息,服务器会逐条接收并回复。
2. 接收并回复
描述: 编写一个程序,服务器接收客户端发送的字符串,并将其反转后回复给客户端。
代码示例:
服务器端 (Server.java):
import java.io.*;
import java.net.*;public class Server {public static void main(String[] args) throws IOException {// 创建 ServerSocket 对象,监听指定端口ServerSocket serverSocket = new ServerSocket(8080);System.out.println("服务器启动,监听端口 8080");while (true) {// 阻塞等待客户端连接Socket socket = serverSocket.accept();System.out.println("客户端连接成功: " + socket.getInetAddress().getHostAddress());// 获取输入流和输出流BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));PrintWriter out = new PrintWriter(socket.getOutputStream(), true);// 接收客户端发送的消息String message = in.readLine();System.out.println("收到客户端消息: " + message);// 反转消息String reversedMessage = new StringBuilder(message).reverse().toString();// 将反转后的消息发送回客户端out.println(reversedMessage);System.out.println("发送回复: " + reversedMessage);// 关闭连接socket.close();}}
}
客户端 (Client.java):
import java.io.*;
import java.net.*;public class Client {public static void main(String[] args) throws IOException {// 创建 Socket 对象,连接服务器Socket socket = new Socket("127.0.0.1", 8080);// 获取输入流和输出流BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));PrintWriter out = new PrintWriter(socket.getOutputStream(), true);// 发送消息out.println("hello world");System.out.println("发送消息: hello world");// 接收服务器回复String response = in.readLine();System.out.println("接收回复: " + response);// 关闭连接socket.close();}
}
运行步骤:
-
运行 Server.java,启动服务器。
-
运行 Client.java,启动客户端。
-
客户端会发送 "hello world",服务器会将它反转为 "dlrow olleh" 并回复给客户端。
3. 上传文件
描述: 编写一个程序,客户端上传文件到服务器,服务器保存文件到指定目录。
代码示例:
服务器端 (Server.java):
import java.io.*;
import java.net.*;public class Server {public static void main(String[] args) throws IOException {// 创建 ServerSocket 对象,监听指定端口ServerSocket serverSocket = new ServerSocket(8080);System.out.println("服务器启动,监听端口 8080");while (true) {// 阻塞等待客户端连接Socket socket = serverSocket.accept();System.out.println("客户端连接成功: " + socket.getInetAddress().getHostAddress());// 获取输入流和输出流InputStream in = socket.getInputStream();OutputStream out = socket.getOutputStream();// 接收文件名BufferedReader reader = new BufferedReader(new InputStreamReader(in));String fileName = reader.readLine();System.out.println("接收文件名: " + fileName);// 创建文件输出流File file = new File("upload/" + fileName); // 文件保存到 upload 目录FileOutputStream fileOutputStream = new FileOutputStream(file);// 接收文件内容byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = in.read(buffer)) != -1) {fileOutputStream.write(buffer, 0, bytesRead);}// 发送成功信息out.write("文件上传成功".getBytes());System.out.println("文件上传成功: " + fileName);// 关闭流和连接fileOutputStream.close();in.close();out.close();socket.close();}}
}
客户端 (Client.java):
import java.io.*;
import java.net.*;public class Client {public static void main(String[] args) throws IOException {// 创建 Socket 对象,连接服务器Socket socket = new Socket("127.0.0.1", 8080);// 获取输入流和输出流InputStream in = socket.getInputStream();OutputStream out = socket.getOutputStream();// 上传文件File file = new File("test.txt"); // 上传 test.txt 文件String fileName = file.getName();// 发送文件名PrintWriter writer = new PrintWriter(out, true);writer.println(fileName);// 发送文件内容FileInputStream fileInputStream = new FileInputStream(file);byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = fileInputStream.read(buffer)) != -1) {out.write(buffer, 0, bytesRead);}// 接收服务器回复byte[] response = new byte[1024];in.read(response);System.out.println("服务器回复: " + new String(response));// 关闭流和连接fileInputStream.close();in.close();out.close();socket.close();}
}
运行步骤:
-
确保服务器程序中创建了名为 "upload" 的目录。
-
运行 Server.java,启动服务器。
-
运行 Client.java,启动客户端。
-
客户端会将 "test.txt" 文件上传到服务器,服务器会将文件保存到 "upload" 目录下。
注意:
-
以上案例仅为简单的示例,实际应用中还需要考虑更多细节,例如错误处理、线程安全等。
-
可以根据自己的需求进行修改和扩展,例如增加文件大小限制、添加进度条等功能。
相关文章:
Java 之网络编程小案例
1. 多发多收 描述: 编写一个简单的聊天程序,客户端可以向服务器发送多条消息,服务器可以接收所有消息并回复。 代码示例: 服务器端 (Server.java): import java.io.*; import java.net.*; import java.util.concurrent.Execut…...
Spring Boot:现代化Java应用开发的艺术
目录 什么是Spring Boot? 为什么选择Spring Boot? Spring Boot的核心概念 详细步骤:创建一个Spring Boot应用 步骤1:使用Spring Initializr创建项目 步骤2:解压并导入项目 步骤3:构建和配置项目 po…...
Redis五种基本数据结构的使用
Redis具有五种基本数据类型:String(字符串)、Hash(哈希)、List(列表)、Set(集合)、SortedSet(有序集合),下面示意它们的使用。 String类数据类型的使用 增:添加数据(set)、添加多个数据(mset)、添加数据时指定过期时间(setex) 删…...
【QT】系统-下
欢迎来到Cefler的博客😁 🕌博客主页:折纸花满衣 🏠个人专栏:QT 目录 👉🏻QTheadrun() 👉🏻QMutex👉🏻QWaitCondition👉🏻Q…...
java和kotlin 可以同时运行吗
Java 和 Kotlin 可以同时运行在同一个项目中,这主要得益于 Kotlin 对 Java 的互操作性。Kotlin 被设计为与 Java 100% 兼容,这意味着 Kotlin 代码可以很容易地调用 Java 代码,反之亦然。这种设计使得 Kotlin 能够无缝集成到现有的 Java 项目中…...
2024最新版 Tuxera NTFS for Mac 2023绿色版图文安装教程
在数字化时代,数据的存储和传输变得至关重要。Mac用户经常需要在Windows NTFS格式的移动硬盘上进行读写操作,然而,由于MacOS系统默认不支持NTFS的写操作,这就需要我们寻找一款高效的读写软件。Tuxera NTFS for Mac 2023便是其中…...
npm发布插件超级简单版
在开源的世界里,每个人都有机会成为贡献者,甚至是创新的引领者。您是否有过这样的想法:开发一个解决特定问题的小工具,让他成为其他开发者手中的利器?今天,我们就来一场实战训练,学习如何将你的…...
C# 访问Access存取图片
图片存入ole字段,看有的代码是获取图片的字节数组转换为base64字符串,存入数据库;显示图片是把base64字符串转换为字节数组再显示;直接存字节数组可能还好一点; 插入的时候用带参数的sql写法比较好;用拼接…...
正则表达式中常见字符的用法介绍
正则表达式(Regular Expression,简称Regex)是一种文本模式描述的方法,包括普通字符(如a到z之间的字母)和特殊字符(称为“元字符”)。正则表达式使用单个字符串来描述、匹配一系列符合…...
Vue3.0组合式API:依赖注入provide和inject实现跨层组件的通信
Vue3.0组合式API系列文章: 《Vue3.0组合式API:setup()函数》 《Vue3.0组合式API:使用reactive()、ref()创建响应式代理对象》 《Vue3.0组合式API:computed计算属性、watch监听器、watchEffect高级监听器》 《Vue3.0组合式API&…...
VSCode中配置C/C++环境
在Visual Studio Code(VSCode)中配置C/C环境是一个相对直接且功能强大的过程,它能让开发者利用VSCode的诸多便利功能来编写、编译和调试C/C代码。以下是一个详细的步骤指南,涵盖了从安装必要的软件到配置编译器、调试器以及VSCode…...
vue实现鼠标滚轮控制页面横向滑动
先看效果 20240919_095531 1.首先创建一个xScroll.vue组件 <template><div class"main" v-size-ob"mainSize"><div class"v-scroll"><div class"content"><slot></slot></div></div>…...
【Git使用】删除Github仓库中的指定文件/文件夹
前言: 上篇文章带大家上传了第一个项目至github,那要是想删除仓库中的指定文件夹怎么办?在Github中 仓库是无法通过鼠标操作直接删除文件和文件夹的,那只能通过 git 命令来执行删除操作。接下来就带大家进行操作。 详细步骤: 一…...
Iptables命令常用命令
前言:下是一些非常实用的 iptables 命令合集,涵盖网络攻击防护和日常网络安全防护 1. 查看当前规则 iptables -L -v -n查看现有的所有规则,-v 显示详细信息,-n 禁止解析IP地址和端口以加快显示速度。 2. 清空所有规则 iptables -F清除所有已…...
前端开发之原型模式
介绍 原型模式本质就是借用一个已有的实例做原型,在这原型基础上快速复制出一个和原型一样的一个对象。 class CloneDemo {name clone democlone(): CloneDemo {return new CloneDemo()} } 原型原型链 函数(class)都有显示原型 prototyp…...
分布式缓存服务Redis版解析与配置方式
一、Redis分布式缓存服务概述 Redis是一款高性能的键值对(Key-Value)存储系统,通常用作分布式缓存服务。它基于内存运行,支持丰富的数据类型,并具备高并发、低延迟的特点,非常适合用于缓存需要频繁访问的数…...
WordPress建站钩子函数及使用
目录 前言: 使用场景: 一、常用的wordpress钩子(动作钩子、过滤器钩子) 1、动作钩子(Action Hooks) 2、过滤器钩子(Filter Hooks) 二、常用钩子示例 1、添加自定义 CSS 和 JS…...
Qt 模型视图(二):模型类QAbstractItemModel
文章目录 Qt 模型视图(二):模型类QAbstractItemModel1.基本概念1.1.模型的基本结构1.2.模型索引1.3.行号和列号1.4.父项1.5.项的角色1.6.总结 Qt 模型视图(二):模型类QAbstractItemModel 模型/视图结构是一种将数据存储和界面展示分离的编程方法。模…...
算法打卡 Day41(动态规划)-理论基础 + 斐波那契数 + 爬楼梯 + 使用最小花费爬楼梯
文章目录 理论基础Leetcode 509-斐波那契数题目描述解题思路 Leetcode 70-爬楼梯题目描述解题思路 Leetcode 746-用最小花费爬楼梯题目描述解题思路 理论基础 动态规划,简称 DP,其中的每一个状态一定是由上一个状态推导出来的,而贪心算法没有…...
鸿蒙环境服务端签名直传文件到OSS
本文介绍如何在鸿蒙环境下将文件上传到OSS。 背景信息 鸿蒙环境是当下比较流行的操作环境,与服务端签名直传的原理类似,鸿蒙环境上传文件到OSS是利用OSS提供的PutObject接口来实现文件上传到OSS。关于PutObject的详细介绍,请参见PutObject。…...
Unity-MCP协议:可嵌入、可协商的AI上下文通信标准
1. 这不是又一个“AI插件”,而是Unity开发工作流的底层重定义你有没有过这样的时刻:在Unity里反复调整Animator Controller的过渡条件,只为让角色转身动画不穿模;写完一段NavMesh寻路逻辑,却要花两小时调试Agent卡在斜…...
3分钟快速上手:用BetterNCM安装器彻底改造你的网易云音乐
3分钟快速上手:用BetterNCM安装器彻底改造你的网易云音乐 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 还在使用功能单一的网易云音乐吗?想不想让你的播放器拥…...
AI赋能5G核心网故障诊断:从PCAP解析到智能根因分析的工程实践
1. 项目概述:当AI遇见5G核心网故障诊断在5G核心网的运维与测试一线干了这么多年,最头疼的莫过于面对海量的PCAP抓包文件。一个复杂的信令流程下来,动辄几千甚至上万个数据包,工程师需要像侦探一样,逐帧审视协议交互&am…...
服务器日志分析实战:用Python追踪HTTP 404错误并可视化异常频率
作为一名爬虫开发者或网站运维人员,服务器日志就像飞机的“黑匣子”——它记录了每个请求的来龙去脉。而404错误(页面未找到)尤其值得关注:它可能是用户输错了网址,可能是你爬虫的URL构造逻辑有漏洞,也可能是网站改版后旧的链接失效了。更严重的是,大量突然涌出的404请求…...
力扣HOT100(30)两两交换链表中的节点
链表的交换要注意 “链表不断链”。前驱和后继都要连着迭代法(必学死磕!O (n) 时间,O (1) 空间)1. 为什么必须用虚拟头节点?因为交换后链表的头节点会变! 比如示例 1 中,原来的头是 1࿰…...
森优时铁锌维发根养黑用三个月真实效果实测:内服营养养黑的客观测评
"森优时铁锌维发根养黑用三个月真实效果实测显示,针对压力、熬夜引发的早白问题,通过内服补充毛囊所需营养的方式,多数使用者能感受到发根韧性提升、新生发色素沉淀改善,整体改善效果因人而异,合规的营养补充是目…...
2026年LLM推理加速全景:量化、投机解码与KV Cache工程实战
大语言模型推理速度慢、成本高,是阻碍AI大规模落地的核心障碍之一。一个7B参数的模型,在标准配置下每秒只能生成约30个token,对于需要实时响应的应用来说几乎无法接受。但2026年,一系列推理加速技术的成熟,让这一局面发…...
2027考研全套资料免费分享
备战27考研最全备考资料整理完毕,一路走来深知备考搜集资料耗费大量时间,浪费不少精力。特意整理2027考研全科完整版资源,全部打包汇总,零基础考生直接拿来就能使用,省去四处搜集资料的烦恼。资料内含:&…...
超维计算(HDC)原理与ScalableHD架构优化实践
1. 超维计算(HDC)基础解析超维计算(Hyperdimensional Computing, HDC)是一种受大脑信息处理机制启发的计算范式,其核心思想是用高维随机向量(通常称为超向量或HV)来表示和处理信息。与传统神经网…...
企业内统一API网关与Taotoken聚合平台对接方案
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 企业内统一API网关与Taotoken聚合平台对接方案 在推进AI应用落地的过程中,许多中大型企业面临一个共同挑战:…...
