当前位置: 首页 > news >正文

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();}
}

运行步骤:

  1. 运行 Server.java,启动服务器。

  2. 运行 Client.java,启动客户端。

  3. 客户端会发送 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();}
}

运行步骤:

  1. 运行 Server.java,启动服务器。

  2. 运行 Client.java,启动客户端。

  3. 客户端会发送 "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();}
}

运行步骤:

  1. 确保服务器程序中创建了名为 "upload" 的目录。

  2. 运行 Server.java,启动服务器。

  3. 运行 Client.java,启动客户端。

  4. 客户端会将 "test.txt" 文件上传到服务器,服务器会将文件保存到 "upload" 目录下。

注意:

  • 以上案例仅为简单的示例,实际应用中还需要考虑更多细节,例如错误处理、线程安全等。

  • 可以根据自己的需求进行修改和扩展,例如增加文件大小限制、添加进度条等功能。

http://www.lryc.cn/news/441628.html

相关文章:

  • Spring Boot:现代化Java应用开发的艺术
  • Redis五种基本数据结构的使用
  • 【QT】系统-下
  • java和kotlin 可以同时运行吗
  • 2024最新版 Tuxera NTFS for Mac 2023绿色版图文安装教程
  • npm发布插件超级简单版
  • C# 访问Access存取图片
  • 正则表达式中常见字符的用法介绍
  • Vue3.0组合式API:依赖注入provide和inject实现跨层组件的通信
  • VSCode中配置C/C++环境
  • vue实现鼠标滚轮控制页面横向滑动
  • 【Git使用】删除Github仓库中的指定文件/文件夹
  • Iptables命令常用命令
  • 前端开发之原型模式
  • 分布式缓存服务Redis版解析与配置方式
  • WordPress建站钩子函数及使用
  • Qt 模型视图(二):模型类QAbstractItemModel
  • 算法打卡 Day41(动态规划)-理论基础 + 斐波那契数 + 爬楼梯 + 使用最小花费爬楼梯
  • 鸿蒙环境服务端签名直传文件到OSS
  • 计算机毕业设计Python+Flask微博情感分析 微博舆情预测 微博爬虫 微博大数据 舆情分析系统 大数据毕业设计 NLP文本分类 机器学习 深度学习 AI
  • solidwork剪裁实体
  • Junit与Spring Test简单使用
  • Vxe UI vue vxe-table 实现自适应列宽,根据内容自适应列的宽度
  • document.visibilityState 监听浏览器最小化
  • 前端框架对比和选择
  • Linux 进程2
  • WPF入门教学六 Grid布局进阶
  • while循环及简单案例
  • 电子看板实时监控数据可视化助力工厂精细化管理
  • 邮储银行:面向金融行业的移动应用安全风险监测案例