netty 文件传输
FileServer
- package com.zhaowb.netty.ch13_1;
- import io.netty.bootstrap.ServerBootstrap;
- import io.netty.channel.ChannelFuture;
- import io.netty.channel.ChannelInitializer;
- import io.netty.channel.ChannelOption;
- import io.netty.channel.EventLoopGroup;
- import io.netty.channel.nio.NioEventLoopGroup;
- import io.netty.channel.socket.SocketChannel;
- import io.netty.channel.socket.nio.NioServerSocketChannel;
- import io.netty.handler.codec.LineBasedFrameDecoder;
- import io.netty.handler.codec.string.StringDecoder;
- import io.netty.handler.codec.string.StringEncoder;
- import io.netty.util.CharsetUtil;
- import java.io.File;
- public class FileServer {
- public void run(int port) throws Exception {
- EventLoopGroup bossGroup = new NioEventLoopGroup();
- EventLoopGroup workerGroup = new NioEventLoopGroup();
- try {
- ServerBootstrap b = new ServerBootstrap();
- b.group(bossGroup, workerGroup)
- .channel(NioServerSocketChannel.class)
- .option(ChannelOption.SO_BACKLOG, 100)
- .childHandler(new ChannelInitializer<SocketChannel>() {
- @Override
- protected void initChannel(SocketChannel ch) throws Exception {
- ch.pipeline().addLast(
- new StringEncoder(CharsetUtil.UTF_8),// 将文件内容编码为字符串
- // 这2个解码器一起使用就是文本换行解码器
- new LineBasedFrameDecoder(1024),// 根据回车换行符对数据包进行解码
- new StringDecoder(CharsetUtil.UTF_8),// 将数据包解码成字符串,
- new FileServerHandler()
- );
- }
- });
- ChannelFuture f = b.bind(port).sync();
- System.out.println("Start file server at port : " + port);
- f.channel().closeFuture().sync();
- } finally {
- bossGroup.shutdownGracefully();
- workerGroup.shutdownGracefully();
- }
- }
- public static void main(String[] args) throws Exception{
- int port = 8080;
- new FileServer().run(port);
- }
- }
FileServerHandler
- package com.zhaowb.netty.ch13_1;
- import io.netty.channel.ChannelHandlerContext;
- import io.netty.channel.DefaultFileRegion;
- import io.netty.channel.FileRegion;
- import io.netty.channel.SimpleChannelInboundHandler;
- import java.io.File;
- import java.io.RandomAccessFile;
- import java.sql.SQLOutput;
- public class FileServerHandler extends SimpleChannelInboundHandler<String> {
- private static final String CR = System.getProperty("line.separator");
- @Override
- protected void messageReceived(ChannelHandlerContext ctx, String msg) throws Exception {
- File file = new File(msg);
- // 校验文件的合法性,不存在构造异常消息返回。如果存在使用RandomAccessFile 以只读的方式打开文件,然后使用netty的
- // DefaultFileRegion 进行文件传输,
- // FileChannel file, 文件通道,用于对文件进行读写操作
- // long position,文件操作的指针位置,读取或写入的起始点
- // long count,操作的总字符数
- if (file.exists()){
- if (!file.isFile()){
- ctx.writeAndFlush("Not a file " + msg);
- return;
- }
- ctx.write(file +" " + file.length() + CR);
- RandomAccessFile randomAccessFile = new RandomAccessFile(msg,"r");
- FileRegion region = new DefaultFileRegion(randomAccessFile.getChannel(),0,randomAccessFile.length());
- ctx.write(region);
- ctx.writeAndFlush(CR); // 写入换行符,告诉CMD控制台,文件传输结束。
- randomAccessFile.close();
- }else {
- ctx.writeAndFlush("File not found " + file + CR);
- }
- }
- @Override
- public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
- cause.printStackTrace();
- ctx.close();
- }
- @Override
- public void channelActive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("连接成功!");
- }
- }
启动FileServer 之后再CMD控制台 输入 telnet localhost 8080
然后输入文件的绝对路径比如 D:\hello.txt ,在操作时,出现了中文乱码的问题,应该是Windows的原因。
netty 文件传输的更多相关文章
- Netty学习(十)-Netty文件上传
今天我们来完成一个使用netty进行文件传输的任务.在实际项目中,文件传输通常采用FTP或者HTTP附件的方式.事实上通过TCP Socket+File的方式进行文件传输也有一定的应用场景,尽管不是主 ...
- Linux主机上实现树莓派的交叉编译及文件传输,远程登陆
0.环境 Linux主机OS:Ubuntu14.04 64位,运行在wmware workstation 10虚拟机 树莓派版本:raspberry pi 2 B型. 树莓派OS:官网下的的raspb ...
- putty提供的两个文件传输工具PSCP、PSFTP详细介绍
用 SSH 来传输文件 PuTTY 提供了两个文件传输工具 PSCP (PuTTY Secure Copy client) PSFTP (PuTTY SFTP client) PSCP 通过 SSH ...
- c# 局域网文件传输实例
一个基于c#的点对点局域网文件传输小案例,运行效果截图 //界面窗体 using System;using System.Collections.Generic;using System.Compon ...
- 使用 zssh 进行 Zmodem 文件传输
Zmodem 最早是设计用来在串行连接(uart.rs232.rs485)上进行数据传输的,比如,在 minicom 下,我们就可以方便的用 Zmodem (说 sz .rz 可能大家更熟悉)传输文件 ...
- 在windows 与Linux间实现文件传输(C++&C实现)
要实现windows与linux间的文件传输,可以通过socket网络编程来实现. 这次要实现的功能与<Windows下通过socket进行字符串和文件传输>中实现的功能相同,即客户端首先 ...
- Windows下通过socket进行字符串和文件传输
今天在windows平台下,通过socket实现了简单的文件传输.通过实现这一功能,了解基本的windows网络编程和相关函数的使用方法. 在windows平台上进行网络编程,首先都需要调用函数WSA ...
- Linux下几种文件传输命令 sz rz sftp scp
Linux下几种文件传输命令 sz rz sftp scp 最近在部署系统时接触了一些文件传输命令,分别做一下简单记录: 1.sftp Secure Ftp 是一个基于SSH安全协议的文件传输管理工具 ...
- 艺萌TCP文件传输及自动更新系统介绍(TCP文件传输)(四)
艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输) 该系统基于开源的networkComms通讯框架,此通讯框架以前是收费的,目前已经免费并开源,作者是英国的,开发时间5年多,框架很稳定. 项 ...
随机推荐
- https://blog.csdn.net/rubbertree/article/details/88877262
本文链接:https://blog.csdn.net/rubbertree/article/details/88877262 https://blog.csdn.net/mingtianhaiyouw ...
- leetcode 596 BUG笔记
There is a table courses with columns: student and class Please list out all classes which have more ...
- Ibatis sql语句
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE sqlMap PUBLIC "-/ ...
- 安装jdk 并放在 /usr/java/default 目录下
安装步骤 . mkdir /usr/java 2. tar -xvf jdk*.tar.gz -C /usr/java/ 记得将* 换成版本即可3. ln -s /usr/java/jdk* /usr ...
- 搭建一个自己的SVN服务器
其实方法非常简单,点点鼠标就好了. 上网搜索“VisualSVN Server”,一般来说都是会找到 https://www.visualsvn.com/server/ 这个网站的. 点击上边的Dow ...
- codeforces750E New Year and Old Subsequence 矩阵dp + 线段树
题目传送门 思路: 先看一个大牛的题解 题解里面对矩阵的构造已经写的很清楚了,其实就是因为在每个字符串都有固定的很多中状态,刚好可以用矩阵来表达,所以$(i,j)$这种状态可以通过两个相邻的矩阵的$m ...
- linux 套接字
三.命名套接字 之前的socket只是创建了一个没有名字的资源,其他进程无法访问他.所以也无法从它接受消息.只有当bind给套接字绑定了端口和名字后,其他进程才能找到它. 一般服务器是一定要bind, ...
- 链表list
Don't lost link! list与vector不同之处在于元素的物理地址可以任意. 为保证对列表元素访问的可行性,逻辑上互为前驱和后继的元素之间,应维护某种索引关系.这种索引关系,可抽象地 ...
- pycharm破解教程
转载 查询 https://blog.csdn.net/u014044812/article/details/86679150
- php fopen用法以及解释
$log = fopen('./log.txt','a');//生成一个log.txt文件,a相当于文件的权限 fwrite($log,'成功'."\r\n");//写入文件 mo ...