netty 实现一个断点续传下载工具~支持http,websocket协议~

支持http断点续传下载,后续支持磁力bt等;后端使用netty框架编写,支持http协议接口认证及调用,支持websocket协议对前端进行主动推送下载进度等信息;

 

1.项目结构:

分别为公共模块,核心模块还有web端显示仪表模块;

2.从main方法入口类来看:

 public static void main(String[] args) {
        try {
            //添加主线程关闭钩子,做一些提示等
            addShutdownHook();
        
            //读取用户配置文件
            config = ConfigInit.readConfig();
        
            //加载日志框架
            LogInit.loadLog(config);
            
            //启动netty服务器
            ThreadPoolUtil.POOL.getPool().execute(() -> {
                try {
                    NettyServer.getInstance().start(config);
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    NettyServer.getInstance().stop();
                }
            });
            
            //输出启动信息
            systemOutStart();
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(-1);
        }
    }

3.netty服务器配置:

 private static void addHandler(ChannelPipeline pipeline) {
        //http编解码
        pipeline.addLast(new HttpServerCodec());
        //将大型文件从文件系统复制到内存进行块传输
        pipeline.addLast(new ChunkedWriteHandler());
        //支持post包文件
        pipeline.addLast(new HttpObjectAggregator(1024 * 1024));
        //解析为websocket协议
        pipeline.addLast(new HttpServerExpectContinueHandler());
        //检测连接心跳
        pipeline.addLast(new IdleStateHandler(60, 60 * 60, 60 * 60));
        //websocket登陆拦截
        pipeline.addLast(new WebsocketLoginHandler());
        //websocket拦截路径及发送文件控制
        pipeline.addLast(new WebSocketServerProtocolHandler("/gyws", null, true, 65536 * 10));
        //websocket核心处理类
        pipeline.addLast(new WebSocketHandler());
        //http服务登陆拦截
        pipeline.addLast(new HttpLoginHandler());
        //http服务转换格式
        pipeline.addLast(new HttpJsonConventHandler());
        //http核心处理类
        pipeline.addLast(new HttpServerHandler());
        //尾巴处理类
        pipeline.addLast(new TailHandler());
    }

 

4.http接收下载服务后大致步骤:

1.生成下载文件任务状态文件job.json;

2.检测该下载是否正常;

3.写入文件到临时文件,并生成该文件独有配置文件,支持断点续传;

4.下载完毕进行合并删除临时文件;

5.实时计算下载速率与进度;

关注点:全局状态文件的修改使用到了随机文件锁避免并发修改;任务的销毁等主要线程的安全销毁动作;

 

5.websocket功能:

1.监测所有文件的下载,暂停,删除等命令,进行实时推送到web端;

关注点: 以下代码如果控制websocket的连接数,会出现问题,这里会把http连接也会实时加进来,因为websocket也是http协议的一种;所以换种思路可以在接收websocket的ping信息时进行统计阻止;

public class WebSocketHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {

    @Override
    public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
        /**
        *   if(count>2){
        *      断开连接    
        *  }
        */
        GyCache.channelList.add(ctx);
    }

 

6.还没搞:

1.没有完善登陆页面,目前只是使用固定token进行登陆;

2.目前只是功能完成,需要进一步重构优化代码;

 

 

 

 

 

 

 

 

github : https://github.com/785175323/GY-Download 

喜欢点星星

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值