Java 客户端、服务端NIO大文件传输
一、需求
公司电脑不让使用U盘,又不想通过公司聊天软件传输,怕被监控。但是通过QQ、微信传输文件对文件大小又有限制。基于种种原因,自己简单写了个服务端、客户端进行文件传输,大文件最好在局域网内进行数据传输。
二、pom依赖
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.22</version></dependency>
三、定义服务端
服务端用于接收文件
@Slf4j
public class FileServer {/*** 设置服务端端口*/public static final int PORT = 9999;/*** 指定保存文件地址 例如要把公司文件A,传输到家里电脑上,存为B文件,这里就是B文件的地址*/public static final String PATH = "/Users/admin/Downloads/yinyue31.zip";public static void main(String[] args) {FileChannel fileChannel = null;SocketChannel socketChannel = null;try {// 1. 创建并配置 服务器套接字通道 ServerSocketChannelServerSocketChannel serverSocketChannel = ServerSocketChannel.open();//设置端口serverSocketChannel.socket().bind(new InetSocketAddress(PORT));// 注意这里使用阻塞模式, 不调用该代码// serverSocketChannel.configureBlocking(false);// 2. 获取文件通道fileChannel = new FileOutputStream(PATH).getChannel();log.info("服务端启动完毕******等待接收文件");// 3. 阻塞等待socketChannel = serverSocketChannel.accept();log.info("服务端开始接收文件******");long startTime = System.currentTimeMillis();// 4. 零拷贝核心操作fileChannel.transferFrom(socketChannel, 0, Long.MAX_VALUE);log.info("服务端接收文件结束,耗时{}ms", System.currentTimeMillis() - startTime);} catch (IOException e) {log.error("服务端接收异常{}", e);} finally {// 5. 释放资源if (null != socketChannel) {try {socketChannel.close();} catch (IOException e) {log.error("服务端关闭流socketChannel异常{}", e);}}if (null != fileChannel) {try {fileChannel.close();} catch (IOException e) {log.error("服务端关闭流socketChannel异常{}", e);}}}}
}
四、定义客户端
客户端用于发送文件
@Slf4j
public class FileClient {/*** 设置需要访问的服务端IP*/public static final String IP = "127.0.0.1";/*** 设置需要访问的服务端端口*/public static final int PORT = 9999;/*** 指定读取的文件地址(要被传输的文件) 例如要把文件A传输到家里电脑上,这里就是A文件的地址*/public static final String PATH = "/Users/admin/Downloads/ioa.zip";public static void main(String[] args) {FileChannel fileChannel = null;SocketChannel socketChannel = null;try {// 1. 创建并配置 服务器套接字通道 ServerSocketChannelsocketChannel = SocketChannel.open();socketChannel.connect(new InetSocketAddress(IP, PORT));//socketChannel.configureBlocking(false);// 2. 从文件输入流中获取文件通道 ( FileChannel )fileChannel = new FileInputStream(PATH).getChannel();long startTime = System.currentTimeMillis();// 3. 零拷贝传输数据, 注意记录每次拷贝的起始位置long transferLen;long totalCount = 0;log.info("文件开始传输******");// 使用零拷贝将文件数据传到服务器, 循环终止条件是传输结果小于等于 0while ((transferLen = fileChannel.transferTo(totalCount, Long.MAX_VALUE, socketChannel)) > 0) {totalCount += transferLen;log.info("文件大小:{}", transferLen);}log.info("文件传输完毕, 用时:{}ms", System.currentTimeMillis() - startTime);} catch (IOException e) {log.error("客户端传输异常{}", e);} finally {// 5. 释放资源if (null != socketChannel) {try {socketChannel.close();} catch (IOException e) {log.error("客户端关闭流socketChannel异常{}", e);}}if (null != fileChannel) {try {fileChannel.close();} catch (IOException e) {log.error("客户端关闭流fileChannel异常{}", e);}}}}
}
五、修改重要参数
FileClient
这个类是客户端,要把文件传输到服务端。公司电脑启动这个类。
1、设置需要访问的服务端IP public static final String IP = “127.0.0.1”;
2、设置需要访问的服务端端口 public static final int PORT = 9999;
3、指定读取的文件地址(要被传输的文件) 例如要把文件A传输到家里电脑上,这里就是A文件的地址 public static final String PATH = “/Users/admin/Downloads/ioa.zip”;
FileServer
这个类是服务端,要接收文件的服务。家里电脑启动这个类。
1、设置服务端端口 public static final int PORT = 9999;
2、指定保存文件地址 例如要把公司文件A,传输到家里电脑上,存为B文件,这里就是B文件的地址 public static final String PATH = “/Users/admin/Downloads/yinyue31.zip”;
六、测试
需要在一个局域网下,台式机可能不方便。最好有一台电脑是笔记本。
1、公司电脑和家里电脑都用idea打开这个工程
2、家里电脑运行FileServer类中的main方法
3、公司电脑运行FileClient类中的main方法
七、完整代码
GitHub地址:https://github.com/9925dev/netty-transmission-file
相关文章:

Java 客户端、服务端NIO大文件传输
一、需求 公司电脑不让使用U盘,又不想通过公司聊天软件传输,怕被监控。但是通过QQ、微信传输文件对文件大小又有限制。基于种种原因,自己简单写了个服务端、客户端进行文件传输,大文件最好在局域网内进行数据传输。 二、pom依赖…...

Unity3D与iOS的交互 简单版开箱即用
本文适合的情况如下: Unity客户端人员 与 IOS端研发人员合作的情况 目录 From U3D to iOS 实现原理 1.unity工程目录创建2个文件 NativeCallProxy.m、NativeCallProxy.h 并且放到Unity工程目录Plugins/iOS/unity_ios_plus目录下 2.创建C#调用脚本 定义对应.mm脚…...

限制LitstBox控件显示指定行数的最新数据(3/3)
实例需求:由于数据行数累加增加,控件加载的数据越来越多,每次用户都需要使用右侧滚动条拖动才能查看最新数据。 因此希望ListBox只加载最后10行数据(不含标题行),这样用户可以非常方便地选择数据ÿ…...

Maven进阶系列-仓库和镜像
Maven进阶系列-仓库和镜像 文章目录 Maven进阶系列-仓库和镜像1. 仓库1.1 仓库类型1.2 寻找jar的基本优先级顺序:1.3 仓库优先次序验证示例 2. settings.xml文件2.1 mirrors2.1.1 没有配置mirror2.1.2 配置了mirror2.1.3 <mirrorOf> 2.2 servers2.3 profiles …...

mac下载安装jenkins
下载 https://get.jenkins.io/war/ 启动 使用命令行启动 java -jar jenkins.war 浏览器访问 IP:8080 或 localhost:8080 ,对jenkins进行配置,刚开始需要输入密码 终端会展示密码和密码存放位置 jenkins插件下载地址, 下载后自行上传。 I…...

Mac上的iTerm2和Oh My Zsh 的安装(安装过程和失败详解)
前言(无重点,安装往后看) 由于在很多人的安利下,说很好用,作者今天花费了4个小时用血的教训总结出来的安装教程,我在安装过程中遇到的最大的问题就是 1. curl: (7) Failed to connect to raw.githubusercon…...

阿里云OS系统Alibaba Cloud Linux 3系统的安全更新命令
给客户部署的服务,进入运维阶段,但是经常被客户监测到服务器漏洞,现在整理一下,服务器漏洞问题更新命令步骤。 服务器系统: 阿里云linux服务器:Alibaba Cloud Linux 3 漏洞类型和描述: #3214…...

你写的Python代码到底多快?这些测试工具了解了解
当我们写完一个脚本或一个函数,首先能保证得到正确结果,其次尽可能的快(虽然会说Py慢,但有的项目就是得要基于Py开发) 本期将总结几种获取程序运行时间的方法,极大的帮助对比不同算法/写法效率 插播&…...

网际控制报文协议ICMP
网际控制报文协议ICMP 为了更有效的转发IP数据报和提高交付成功的机会,在网际层使用ICMP(Internet Control Message Protocol)协议,其允许主机或路由器报告差错情况和提供有关异常情况的报告。ICMP报文装在IP数据报中…...

海外腾讯云服务器配置域名的详细说明!!
本文首要针对腾讯云服务器装备域名的问题进行具体的说明,包含域名的品种、注册方法、解析进程以及安全性等方面的介绍,帮助用户更好的理解腾讯云服务器装备域名的全进程。 一、域名的品种 1.域名是互联网上仅有标识一台计算机或一个网络资源的名称&#…...

听GPT 讲Rust源代码--library/std(12)
题图来自 Decoding Rust: Everything You Need to Know About the Programming Language[1] File: rust/library/std/src/os/watchos/mod.rs 该文件(rust/library/std/src/os/watchos/mod.rs)的作用是为Rust标准库提供支持WatchOS操作系统的特定功能。 W…...

06、Caused by: java.nio.charset.MalformedInputException: Input length = 1
目录 问题:原因:解决方法: 问题: Caused by: java.nio.charset.MalformedInputException: Input length 1 原因: 应该是中文有哪些文字导致的。 yml 编码格式出错 解决方法: 直接这里把GBK改成 utf-8…...

探索 Java 8 中的 Stream 流:构建流的多种方式
人嘛,要懂得避嫌… 开篇引入 Java 8引入了Stream流作为一项新的特性,它是用来处理集合数据的一种函数式编程方式。Stream流提供了一种更简洁、高效和易于理解的方法来操作集合数据,同时也能够实现并行处理,以提高性能。 以下是St…...

安卓Apk布局修改从入门到精通
安卓Apk布局修改从入门到精通 课程大纲 本次教程的目标是,学会将安卓apk反向工程后,如何找到需要修改的布局、对布局修改、对布局进行美化,如何隐藏布局(按钮等),以及如何在界面上添加按钮并响应点击事件&…...

React Native 样式及其布局
React Native 样式及其布局 参考 https://reactnative.cn/docs/flexbox 一、样式 在 React Native 中,你并不需要学习什么特殊的语法来定义样式。我们仍然是使用 JavaScript 来写样式。所有的核心组件都接受名为style的属性。这些样式名基本上是遵循了 web 上的 …...

基于51单片机的智能指纹考勤系统设计
**单片机设计介绍,1661【毕设课设】基于51单片机的智能指纹考勤系统设计-原理图-PCB-程序-报告 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于51单片机的智能指纹考勤系统是一种利用51单片机作为主控芯片&#x…...

I/O性能优化——这一篇就足够啦
背景 继上一篇CPU性能优化文章 ,本次向大家分享关于I/O性能优化的分析套路以及常见措施。后续还有关于内存及网络优化的篇章。 基本概念 对于I/O我们先了解几个概念,文件系统,磁盘,文件。 磁盘 磁盘为系统提供了最基本的持久化存…...

【蓝桥杯选拔赛真题44】python小蓝晨跑 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析
目录 python小蓝晨跑 一、题目要求 1、编程实现 2、输入输出 二、算法分析...

摩托车商家做展示预约小程序的作用
摩托车与电动车是人们短距离出行的主要工具,而其使用寿命一般是3年左右及以上、一家可能有多个,市场人群庞大且复购属性强,所以其经营商家也非常多。 如今互联网深入,在品牌宣传、客户获取、信息承载、营销等方面需要车辆经营商家…...

数据库实验:SQL的多表数据查询
目录 实验目的实验内容实验要求实验过程实验代码结果示意 书接上文,但是感觉之前的形式不太好用,至少不是很方便观看,所以这篇尝试改变一下写法,希望可以提升一些观感 实验目的 (1) 掌握RDBMS的数据多表查询功能 (2) 掌握SQL语言…...

【使用Python编写游戏辅助工具】第一篇:概述
引言 欢迎阅读本系列文章,本系列将带领读者朋友们使用Python来实现一个简单而有趣的游戏辅助工具。 写这个系列的缘由源自笔者玩了一款游戏。正巧,笔者对Python编程算是有一定的熟悉,且Python语言具备实现各种有趣功能的能力,因…...

Android与IOS渲染流程对比
目录 Android CPU计算图元信息 GPU干预 几何阶段等后处理 Android APP通过WindowManager统一提供所有Surface的缓冲区【不管是SurfaceView还是普通的布局流程都会将数据提交到Surface的BufferQuene中】 Java中的Surface是null,最终都是由Native层的Surface处理。…...

正则表达式以及 pattern 的撰写方式
正则表达式的撰写方法 在Python中,可以使用re模块来进行正则表达式的撰写和匹配。下面是一个基本的正则表达式撰写方法示例: 导入re模块: python import re定义正则表达式模式: python pattern = r正则表达式其中,r表示原始字符串,可以避免转义字符的问题。 使用re模…...

K8s Error: ImagePullBackOff 故障排除
Error: ImagePullBackOff 故障排除 1. 起因 起因是要在一组k8s环境下做个Prometheus的测试,当时虚拟机用完直接暂停了. 启动完master和node节点后重启了这些节点. 当检查dashboard时候发现Pod处于ImagePullBackOff状态,使用命令查看详细情况 kubectl describe pods -n kuber…...

爬虫之爬虫介绍、requests模块、携带请求参数、url 编码和解码、携带请求头
爬虫介绍 爬虫是什么? 网页蜘蛛,网络机器人,spider在互联网中 通过 程序 自动的抓取数据 的过程根上:使用程序 模拟发送http请求 ⇢ \dashrightarrow ⇢ 得到http响应 ⇢ \dashrightarrow ⇢ 把响应的数据解析出来 ⇢ \dashr…...

pytorch笔记:split
torch.split 是 PyTorch 中的一个函数,用于将张量按指定的大小或张量数量进行分割 1 基本使用方法 torch.split(tensor, split_size_or_sections, dim0)tensor要分割的输入张量split_size_or_sections以是整数或整数列表。 如果是整数,那么它表示每个分…...

K8S运维 解决openjdk:8-jdk-alpine镜像时区和字体问题
目录 一、问题 二、解决 三、完整代码 一、问题 由于项目的Dockerfile中使用openjdk:8-jdk-alpine作为基础镜像来部署服务,此镜像存在一定问题,例如时差8小时问题,或是由于字体问题导致导出excel文件,图片处理内容为空等。 二…...

Kubectl详解(陈述式、声明式)
目录 1、陈述式资源管理方法 1.1 基本信息查看 1.2 项目的生命周期:创建-->发布-->更新-->回滚-->删除 1.3 金丝雀发布(Canary Release) 2、声明式管理方法 1、陈述式资源管理方法 1.kubernetes 集群管理集群资源的唯一入口是…...

使用HttpClient库的爬虫程序
使用HttpClient库的爬虫程序,该爬虫使用C#来抓取内容。 using System; using System.Net.Http; using System.Threading.Tasks; namespace CrawlerProgram {class Program{static void Main(string[] args){// 创建HttpClient对象using (HttpClient client new…...

VSIX:C#项目 重命名所有标识符(Visual Studio扩展开发)
出于某种目的(合法的,真的合法的,合同上明确指出可以这样做),我准备了一个重命名所有标识符的VS扩展,用来把一个C#库改头换面,在简单的测试项目上工作很满意,所有标识符都被准确替换…...