netty 文件传输服务器,Netty之二进制文件传输

本文展示了如何使用Netty实现文件的二进制传输。通过创建一个Netty服务器,客户端发送文件路径,服务器读取文件内容并返回给客户端,客户端接收到后保存到本地。对于大文件,需考虑粘包分包问题。
摘要由CSDN通过智能技术生成

传输会话简要

客户端发起一个文本请求给服务器端, 服务器端解析里面文本, 返回文件给客户端, 客户端解析文件

99219b462d1fd02315547dbe0a026494.png

服务器端

因为示例文件比较小, 所以没有做分段传输, 而是直接一次性把整个文件byte[]都发给客户端了.

如果需要传输大文件, 则需要做粘包拆包, 参考另外一篇博文 Netty之粘包分包

需要三个ChannelPipeline

// 解析客户端发送的文本json

pipeline.addLast(new StringDecoder());

// 二进制文件加密传输

pipeline.addLast(new ObjectEncoder());

// 业务逻辑

pipeline.addLast(new FileServerHandler());

FileServerHandler业务逻辑

// 获取到客户端请求, 解析path, 返回二进制文件

JSONObject jo = new JSONObject(msg.toString());

if (StringUtils.isNotEmpty(jo.optString("path"))) {

PDFContent pdf = new PDFContent();

byte[] content = com.fr.general.IOUtils.inputStream2Bytes(new FileInputStream(jo.optString("path")));

pdf.setContent(content);

ctx.writeAndFlush(pdf);

} else {

System.out.println(jo.optString("res"));

}

客户端

跟服务器端对应的三个ChannelPipeline

// 传输文本给服务器端

p.addLast(new StringEncoder());

// 二进制文件获取解析

p.addLast(new ObjectDecoder(ClassResolvers.cacheDisabled(this

.getClass().getClassLoader())));

// 客户端业务代码

p.addLast(new FileClientHandler());

FileClientHandler业务逻辑

@Override

public void channelActive(ChannelHandlerContext ctx) {

try {

// 将要获取的pdf路径发送给服务器端

JSONObject jo = JSONObject.create().put("path", "d:\\a.pdf");

ctx.writeAndFlush(jo.toString());

} catch (JSONException e) {

e.printStackTrace();

}

}

@Override

public void channelRead(ChannelHandlerContext ctx, Object msg) {

PDFContent content = (PDFContent) msg;

// 从服务器端获取的二进制文件存到本地

String fileName = UUID.randomUUID().toString() + ".pdf";

File file = new File("D:\\" + fileName);

try {

FileOutputStream out = new FileOutputStream(file);

IOUtils.copyBinaryTo(new ByteArrayInputStream(content.getContent()), out);

out.close();

} catch (FileNotFoundException e) {

e.printStackTrace()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值