本次是利用TCP在客户端发送文件流,服务端就接收流,写入相应的文件。

实验的源文件是一个图片,假设地址是D:\\Koala.jpg,接收保存后的图片为D:\\test.jpg
原理就是将文件读取成byte,通过bytebuffer发送即可

客户端
  1. package net.xjdsz.file;
  2. import io.netty.bootstrap.Bootstrap;
  3. import io.netty.buffer.ByteBuf;
  4. import io.netty.buffer.Unpooled;
  5. import io.netty.channel.*;
  6. import io.netty.channel.nio.NioEventLoopGroup;
  7. import io.netty.channel.socket.SocketChannel;
  8. import io.netty.channel.socket.nio.NioSocketChannel;
  9. import java.io.ByteArrayOutputStream;
  10. import java.io.FileInputStream;
  11. import java.io.InputStream;
  12. /**
  13. * Created by dingshuo on 2017/7/6.
  14. */
  15. public class UploadClient {
  16. public static void main(String[] args) throws Exception{
  17. UploadClient client=new UploadClient();
  18. client.connect();
  19. }
  20. public void connect(){
  21. EventLoopGroup group=new NioEventLoopGroup();
  22. try{
  23. Bootstrap b=new Bootstrap();
  24. b.group(group).channel(NioSocketChannel.class)
  25. .option(ChannelOption.TCP_NODELAY,true)
  26. .handler(new ChannelInitializer<SocketChannel>() {
  27. @Override
  28. protected void initChannel(SocketChannel ch) throws Exception {
  29. ch.pipeline().addLast(new ChannelInboundHandlerAdapter(){
  30. @Override
  31. public void channelActive(ChannelHandlerContext ctx) throws Exception {
  32. ByteBuf msg;
  33. InputStream in = new FileInputStream("D:\\Koala.jpg");
  34. ByteArrayOutputStream out = new ByteArrayOutputStream();
  35. byte[] buffer = new byte[1024 * 100];
  36. int n = 0;
  37. while ((n = in.read(buffer)) != -1) {
  38. msg= Unpooled.buffer(buffer.length);
  39. //这里读取到多少,就发送多少,是为了防止最后一次读取没法满填充buffer,
  40. //导致将buffer中的处于尾部的上一次遗留数据也发送走
  41. msg.writeBytes(buffer,0,n);
  42. ctx.writeAndFlush(msg);
  43. msg.clear();
  44. }
  45. System.out.println(n);
  46. }
  47. });
  48. }
  49. });
  50. ChannelFuture f=b.connect("127.0.0.1",20000).sync();
  51. f.channel().closeFuture().sync();
  52. }catch (Exception e){
  53. }finally {
  54. group.shutdownGracefully();
  55. }
  56. }
  57. }

服务端
  1. package net.xjdsz.file;
  2. import io.netty.bootstrap.ServerBootstrap;
  3. import io.netty.buffer.ByteBuf;
  4. import io.netty.channel.*;
  5. import io.netty.channel.nio.NioEventLoopGroup;
  6. import io.netty.channel.socket.SocketChannel;
  7. import io.netty.channel.socket.nio.NioServerSocketChannel;
  8. import io.netty.handler.logging.LogLevel;
  9. import io.netty.handler.logging.LoggingHandler;
  10. import java.io.File;
  11. import java.io.FileOutputStream;
  12. import java.io.IOException;
  13. /**
  14. * Created by dingshuo on 2017/7/6.
  15. */
  16. public class UploadServer {
  17. public void bind(int port) throws Exception{
  18. EventLoopGroup bossGroup=new NioEventLoopGroup();
  19. EventLoopGroup workerGroup=new NioEventLoopGroup();
  20. try{
  21. ServerBootstrap b=new ServerBootstrap();
  22. b.group(bossGroup,workerGroup)
  23. .channel(NioServerSocketChannel.class)
  24. .option(ChannelOption.SO_BACKLOG,1024)
  25. .handler(new LoggingHandler(LogLevel.INFO))
  26. .childHandler(new ChannelInitializer<SocketChannel>() {
  27. @Override
  28. protected void initChannel(SocketChannel ch) throws Exception {
  29. ch.pipeline().addLast(new ChannelInboundHandlerAdapter(){
  30. @Override
  31. public void channelActive(ChannelHandlerContext ctx) throws Exception {
  32. super.channelActive(ctx);
  33. }
  34. @Override
  35. public void channelInactive(ChannelHandlerContext ctx) throws Exception {
  36. super.channelInactive(ctx);
  37. }
  38. @Override
  39. public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
  40. String path="D:\\test.jpg";
  41. File file=new File(path);
  42. if(!file.exists()){
  43. file.createNewFile();
  44. }
  45. FileOutputStream fos=new FileOutputStream(file,true);
  46. // BufferedOutputStream bufferedOutputStream=new BufferedOutputStream(fos);
  47. ByteBuf buf=(ByteBuf)msg;
  48. byte[] bytes=new byte[buf.readableBytes()];
  49. buf.readBytes(bytes);
  50. System.out.println("本次接收内容长度:" + bytes.length);
  51. try {
  52. // bufferedOutputStream.write(bytes, 0, bytes.length);
  53. // buf.release();
  54. fos.write(bytes);
  55. fos.flush();
  56. } catch (IOException e) {
  57. e.printStackTrace();
  58. }
  59. }
  60. });
  61. }
  62. });
  63. //绑定端口,同步等待成功
  64. ChannelFuture f=b.bind(port).sync();
  65. //等待服务端监听端口关闭
  66. f.channel().closeFuture().sync();
  67. }finally {
  68. //退出,释放资源
  69. bossGroup.shutdownGracefully();
  70. workerGroup.shutdownGracefully();
  71. }
  72. }
  73. public static void main(String[] args) throws Exception{
  74. UploadServer uploadServer=new UploadServer();
  75. uploadServer.bind(20000);
  76. }
  77. }

Netty进行文件传输的更多相关文章

  1. netty 文件传输

    FileServer package com.zhaowb.netty.ch13_1; import io.netty.bootstrap.ServerBootstrap; import io.net ...

  2. RPC基于http协议通过netty支持文件上传下载

    本人在中间件研发组(主要开发RPC),近期遇到一个需求:RPC基于http协议通过netty支持文件上传下载 经过一系列的资料查找学习,终于实现了该功能 通过netty实现文件上传下载,主要在编解码时 ...

  3. Linux主机上实现树莓派的交叉编译及文件传输,远程登陆

    0.环境 Linux主机OS:Ubuntu14.04 64位,运行在wmware workstation 10虚拟机 树莓派版本:raspberry pi 2 B型. 树莓派OS:官网下的的raspb ...

  4. putty提供的两个文件传输工具PSCP、PSFTP详细介绍

    用 SSH 来传输文件 PuTTY 提供了两个文件传输工具 PSCP (PuTTY Secure Copy client) PSFTP (PuTTY SFTP client) PSCP 通过 SSH ...

  5. c# 局域网文件传输实例

    一个基于c#的点对点局域网文件传输小案例,运行效果截图 //界面窗体 using System;using System.Collections.Generic;using System.Compon ...

  6. 使用 zssh 进行 Zmodem 文件传输

    Zmodem 最早是设计用来在串行连接(uart.rs232.rs485)上进行数据传输的,比如,在 minicom 下,我们就可以方便的用 Zmodem (说 sz .rz 可能大家更熟悉)传输文件 ...

  7. 在windows 与Linux间实现文件传输(C++&C实现)

    要实现windows与linux间的文件传输,可以通过socket网络编程来实现. 这次要实现的功能与<Windows下通过socket进行字符串和文件传输>中实现的功能相同,即客户端首先 ...

  8. Windows下通过socket进行字符串和文件传输

    今天在windows平台下,通过socket实现了简单的文件传输.通过实现这一功能,了解基本的windows网络编程和相关函数的使用方法. 在windows平台上进行网络编程,首先都需要调用函数WSA ...

  9. Linux下几种文件传输命令 sz rz sftp scp

    Linux下几种文件传输命令 sz rz sftp scp 最近在部署系统时接触了一些文件传输命令,分别做一下简单记录: 1.sftp Secure Ftp 是一个基于SSH安全协议的文件传输管理工具 ...

随机推荐

  1. 微信小程序开发之图片等比例缩放 获取屏幕尺寸图片尺寸 自适应

    wxml: <image style="width: {{imagewidth}}px; height: {{imageheight}}px;"  src="{{i ...

  2. 三、Redis操作

    一.基本介绍 1.简介 Redis是由意大利人Salvatore Sanfilippo(网名:antirez)开发的一款内存高速缓存数据库.Redis全称为:Remote Dictionary Ser ...

  3. [运维]Dell R710 raid配置 标签: raid运维 2017-04-15 19:35 581人阅读 评论(16)

    Dell R系列的一些服务器,raid的配置都大同小异,公司大部分的服务器,都是Dell R710型号的,这个型号的raid界面配置起来还是很简单的,下面来跟随小编体验一下raid如何配置吧.ps:图 ...

  4. PLAY2.6-SCALA(十一) 模板常用场景

    1.布局 声明一个views/main.scala.html模板作为主布局模板 @(title: String)(content: Html) <!DOCTYPE html> <ht ...

  5. cat、head、tail、more和less命令(文件内容浏览)

    一.cat命令 cat命令连接文件并打印到标准输出设备上,cat经常用来显示文件的内容. 注意:当文件较大时,文本在屏幕上迅速闪过(滚屏),用户往往看不清所显示的内容.因此,一般用more等命令分屏显 ...

  6. Oracle之PL/SQL编程

    PL/SQL(Procedural Language/SQL,过程语言/SQL) 是结合了Oracel过程语言和结构化查询语言(SQL)的一种扩展语言. 优点: (1)PL/SQL具有编程语言的特点, ...

  7. [已转移]js事件流之事件冒泡的应用----事件委托

    该文章已转移到博客:https://cynthia0329.github.io/ 什么是事件委托? 它还有一个名字叫事件代理. JavaScript高级程序设计上讲: 事件委托就是利用事件冒泡,只指定 ...

  8. Laravel 登录后清空COOKIE 方法

    需求 在Laravel 登陆立即清空保存的COOKIE数组 实现 # Http/Controllers/Auth/LoginController.php public function redirec ...

  9. jmeter进行的接口测试和压力测试

    1.接口测试 接口测试的内容我们之前已经讲过,values-key形式和json串传参形式: 包括的协议有http,webservice(soap),jdbc数据库,java请求 2.参数化 定义:把 ...

  10. Spring MVC 关于controller的字符编码问题

    在使用springMVC框架构建web应用,客户端常会请求字符串.整型.json等格式的数据,通常使用@ResponseBody注解使 controller回应相应的数据而不是去渲染某个页面.如果请求 ...