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年多,框架很稳定. 项 ...
随机推荐
- Devstack 配置文件说明手册
本文为minxihou的翻译文章,转载请注明出处Bob Hou: http://blog.csdn.net/minxihou JmilkFan:minxihou的技术博文方向是 算法&Open ...
- 6、通过Appium Desktop 实现录制功能
1.老规矩,我们进入下面这个界面 图中红色标记1为 “top by coordinates” 按钮, 这是一种通过坐标定位元素的方式. 图中红色标记2为 “Start Recording” 按钮, ...
- 【react】---Hooks的基本使用---【巷子】
一.react-hooks概念 React中一切皆为组件,React中组件分为类组件和函数组件,在React中如果需要记录一个组件的状态的时候,那么这个组件必须是类组件.那么能否让函数组件拥有类组件的 ...
- vim对行进行排序
vim自带排序函数sort, 在命令行模式下执行:help sort 可查看其具体用法,摘录如下: Vim has a sorting function and a sorting command. ...
- MVC--MVP?
第一部分:什么是MVP?什么是MVC? 1.什么是MVP? M:数据层(数据库.网络.文件存储等等...) V:View和Activity和Fragment以及它们的子类 P:中介->Prese ...
- NFS 服务器的配置
1. 安装 NFS 服务器 [root@localhost btools]#rpm -q nfs-utils 如果没有安装,从对应 Linux 操作系统版本的安装光盘上找到 nfs-utils 的安装 ...
- C/C++通用Makefile
最近的项目又回到了Linux上运行,这就需要在Linux下编译项目,写Makefile针对习惯了Windows的程序员来说是一件痛苦的事,如果有一个通用的Makefile该多好啊,本着这样的目的,我再 ...
- IPv4 IPv6
IP提供了一种best-effort,connection-less数据delivery服务. best-efforty意味着它不保证IP数据段会成功到达目的地.当error发生时,IP通常选择丢弃d ...
- Linux下安装.NETCore3.0
今天把.NETCore从2.2升到3.0记录一下 Download .NET Core 3.0 :https://dotnet.microsoft.com/download/dotnet-core/ ...
- Python自学:第四章 复制列表(1)
# -*- coding: GBK -*- my_foods = ['pizza', 'falafel', 'carrot cake'] friend_foods = my_foods[:] prin ...