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。…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...

Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
Spring Security 认证流程——补充
一、认证流程概述 Spring Security 的认证流程基于 过滤器链(Filter Chain),核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤: 用户提交登录请求拦…...

Matlab实现任意伪彩色图像可视化显示
Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中,如何展示好看的实验结果图像非常重要!!! 1、灰度原始图像 灰度图像每个像素点只有一个数值,代表该点的亮度(或…...
TJCTF 2025
还以为是天津的。这个比较容易,虽然绕了点弯,可还是把CP AK了,不过我会的别人也会,还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...

负载均衡器》》LVS、Nginx、HAproxy 区别
虚拟主机 先4,后7...

二叉树-144.二叉树的前序遍历-力扣(LeetCode)
一、题目解析 对于递归方法的前序遍历十分简单,但对于一位合格的程序猿而言,需要掌握将递归转化为非递归的能力,毕竟递归调用的时候会调用大量的栈帧,存在栈溢出风险。 二、算法原理 递归调用本质是系统建立栈帧,而非…...