图片来自 包图网
建华网站制作公司哪家好,找创新互联公司!从网页设计、网站建设、微信开发、APP开发、自适应网站建设等网站项目制作,到程序开发,运营维护。创新互联公司于2013年创立到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联公司。
今天笔者就抽空做了一个实时视频弹幕交互的小功能,不得不说这样的形式为看视频看直播,讲义 PPT,抽奖等形式增加了许多乐趣。
①Netty
官方对于 Netty 的描述:
- https://netty.io/
主要关键词描述:Netty 是异步事件驱动网络框架,可做各种协议服务端,并且支持了 FTP,SMTP,HTTP 等很多协议,并且性能,稳定性,灵活性都很棒。
可以看到 Netty 整体架构上分了三个部分:
②WebSocket
WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。WebSocket 通信协议于 2011 年被 IETF 定为标准 RFC 6455,并由 RFC7936 补充规范。
WebSocket API 也被 W3C 定为标准。WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。
在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
为什么做这样的技术选型:
①服务架构
整体架构是所有客户端都和我的服务端开启一个双向通道的架构。
②传输流程
如下图:
先看看效果吧,是不是 perfect,接下来就来看具体代码是怎么实现的吧。
视频直播弹幕示例
①项目结构
一个 maven 项目,将代码放一个包下就行。
②Java 服务端
Java 服务端代码,总共三个类,Server,Initailizer 和 Handler。
先做一个 netty nio 的服务端:一个 nio 的服务,开启一个 tcp 端口。
- import io.netty.bootstrap.ServerBootstrap;
- import io.netty.channel.ChannelFuture;
- import io.netty.channel.EventLoopGroup;
- import io.netty.channel.nio.NioEventLoopGroup;
- import io.netty.channel.socket.nio.NioServerSocketChannel;
- /**
- * Copyright(c)lbhbinhao@163.com
- * @author liubinhao
- * @date 2021/1/14
- * ++++ ______ ______ ______
- * +++/ /| / /| / /|
- * +/_____/ | /_____/ | /_____/ |
- * | | | | | | | | |
- * | | | | | |________| | |
- * | | | | | / | | |
- * | | | | |/___________| | |
- * | | |___________________ | |____________| | |
- * | | / / | | | | | | |
- * | |/ _________________/ / | | / | | /
- * |_________________________|/b |_____|/ |_____|/
- */
- public enum BulletChatServer {
- /**
- * Server instance
- */
- SERVER;
- private BulletChatServer(){
- EventLoopGroup mainGroup = new NioEventLoopGroup();
- EventLoopGroup subGroup = new NioEventLoopGroup();
- ServerBootstrap server = new ServerBootstrap();
- server.group(mainGroup,subGroup)
- .channel(NioServerSocketChannel.class)
- .childHandler(new BulletChatInitializer());
- ChannelFuture future = server.bind(9123);
- }
- public static void main(String[] args) {
- }
- }
服务端的具体处理逻辑:
- import io.netty.channel.ChannelInitializer;
- import io.netty.channel.ChannelPipeline;
- import io.netty.channel.socket.SocketChannel;
- import io.netty.handler.codec.http.HttpObjectAggregator;
- import io.netty.handler.codec.http.HttpServerCodec;
- import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
- import io.netty.handler.stream.ChunkedWriteHandler;
- import io.netty.handler.timeout.IdleStateHandler;
- /**
- * Copyright(c)lbhbinhao@163.com
- *
- * @author liubinhao
- * @date 2021/1/14
- * ++++ ______ ______ ______
- * +++/ /| / /| / /|
- * +/_____/ | /_____/ | /_____/ |
- * | | | | | | | | |
- * | | | | | |________| | |
- * | | | | | / | | |
- * | | | | |/___________| | |
- * | | |___________________ | |____________| | |
- * | | / / | | | | | | |
- * | |/ _________________/ / | | / | | /
- * |_________________________|/b |_____|/ |_____|/
- */
- public class BulletChatInitializer extends ChannelInitializer
{ - @Override
- protected void initChannel(SocketChannel ch) throws Exception {
- ChannelPipeline pipeline = ch.pipeline();
- pipeline.addLast(new HttpServerCodec());
- pipeline.addLast(new ChunkedWriteHandler());
- pipeline.addLast(new HttpObjectAggregator(1024*64));
- pipeline.addLast(new IdleStateHandler(8, 10, 12));
- pipeline.addLast(new WebSocketServerProtocolHandler("/lbh"));
- pipeline.addLast(new BulletChatHandler());
- }
- }
后台处理逻辑,接受到消息,写出到所有的客户端:
- import io.netty.channel.Channel;
- import io.netty.channel.ChannelHandler;
- import io.netty.channel.ChannelHandlerContext;
- import io.netty.channel.SimpleChannelInboundHandler;
- import io.netty.channel.group.ChannelGroup;
- import io.netty.channel.group.DefaultChannelGroup;
- import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
- import io.netty.util.concurrent.EventExecutorGroup;
- import io.netty.util.concurrent.GlobalEventExecutor;
- /**
- * Copyright(c)lbhbinhao@163.com
- *
- * @author liubinhao
- * @date 2021/1/14
- * ++++ ______ ______ ______
- * +++/ /| / /| / /|
- * +/_____/ | /_____/ | /_____/ |
- * | | | | | | | | |
- * | | | | | |________| | |
- * | | | | | / | | |
- * | | | | |/___________| | |
- * | | |___________________ | |____________| | |
- * | | / / | | | | | | |
- * | |/ _________________/ / | | / | | /
- * |_________________________|/b |_____|/ |_____|/
- */
- public class BulletChatHandler extends SimpleChannelInboundHandler
{ - // 用于记录和管理所有客户端的channel
- public static ChannelGroup channels =
- new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
- @Override
- protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception {
- // 获取客户端传输过来的消息
- String content = msg.text();
- System.err.println("收到消息:"+ content);
- channels.writeAndFlush(new TextWebSocketFrame(content));
- System.err.println("写出消息完成:"+content);
- }
- @Override
- public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
- channels.add(ctx.channel());
- }
- @Override
- public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
- String channelId = ctx.channel().id().asShortText();
- System.out.println("客户端被移除,channelId为:" + channelId);
- channels.remove(ctx.channel());
- }
- @Override
- public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
- cause.printStackTrace();
- // 发生异常之后关闭连接(关闭channel),随后从ChannelGroup中移除
- ctx.channel().close();
- channels.remove(ctx.channel());
- }
- }
③网页客户端实现
代码如下:
Netty视频弹幕实现 Author:Binhao Liu 发送
这样一个实时的视频弹幕功能就完成啦,是不是很简单,各位小伙伴快来试试吧。
这个还是很简单,笔者写这个的时候一会儿就写完了。不过这也得益于笔者很久以前就写过 Netty 的服务,对于 HTTP,TCP 之类协议也比较熟悉。
只有前端会有些难度,问下度娘,也很快能做完,在此分享出来与诸君分享,有问题可找笔者交流。
作者:兴趣使然的程序猿
编辑:陶家龙
出处:http://adkx.net/w71wf
分享名称:老板怒吼:今晚整一个B站弹幕交互功能
路径分享:http://www.shufengxianlan.com/qtweb/news20/275270.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联