Android视频直播 ------ 3.2 传输 -- protobuf对象序列化

1、官网介绍,https://developers.google.cn/protocol-buffers,可以当作一个小插件,有自己的的编程语言结构,上手很容易,下面开始:

2、 AndroidStudio 集成protobuf

2.1 在project工程目录下的build.gradle 中

dependencies{

    classpath'com.google.protobuf:protobuf-gradle-plugin:0.8.8'

}


2.2 在app工程目录下的build.gradle 中添加
apply plugin:'com.android.application'

apply plugin:'com.google.protobuf'


2.3 在app工程目录下的build.gradle 中添加

dependencies{

    api 'com.google.protobuf:protobuf-lite:3.0.0'

}


2.4 手写自定义proto类,名字随便取,以.proto后缀结尾



2.5  看下类中具体代码怎么写,

syntax = "proto3";//版本

package com.ltx.netty.chat;//包名,自定义

option java_outer_classname = "NettyMessage";//build构建后的java类名

//需要以message开头,RegisterProto自定义,1,2,3... 每新增一个属性就加1

//类型string对应java String

//类型int32对应java int

//类型int32对应java int

//类型bytes对应java byte[]

message RegisterProto{

    string from = 1;//发送者

    string to = 2;//接受者

    int32 type = 3;//消息类型

    string content = 4;//String消息扩展,json即可

    bytes frame = 5;//数据流:视频流,文件流。

}


2.6 安装AndroidStudio插件 可以更好的编写,有提示,能更方便编写。

plugins 搜索 protocol buffer editor,安装重启as即可


2.7 结合netty发送消息,还记得netty 连接服务器成功后,会得到一个socketChannel

public void sendMsg(NMessage message,Callback callback) {

        NettyLibUtils.i("NettyPushService sendMsg " + message);

        if (socketChannel ==null){

                Log.i("NettyPushService","socketChannel = null" );

                return;

       }

        NettyMessage.RegisterProto.Builder builder =NettyMessage.RegisterProto.newBuilder();

        builder.setFrom(message.getFrom());

        builder.setType(message.getType());

        builder.setTo(message.getTo());

        builder.setContent(message.getContent());

        builder.setFrame(ByteString.copyFrom(message.getFrame()));

        socketChannel.writeAndFlush(builder)

                .addListener((ChannelFutureListener) future -> {

                    if (future.isSuccess()) {

                            if (callback !=null) {

                                callback.onEvent(1,"发送成功",null);

                            }

                    }else {

                            if (callback !=null) {

                                callback.onEvent(MsgCode.LOGIN_OUT,"发送失败",null);

                        }

                    }

});

}


2.8   服务端消息处理,客户端和服务端一样,只介绍服务端,客户端记得要切换主线使用消息

自定义类NettyServerMultiHandler继承SimpleChannelInboundHandler,需要在服务器和客户端注册

 socketChannel.pipeline().addLast(new NettyServerMultiHandler());

类代码如下

public class NettyServerMultiHandler extends SimpleChannelInboundHandler {

@Override

protected void channelRead0(ChannelHandlerContext ctx,Object msg) {

            if (msg  instanceof NettyMessage.RegisterProto){

                    NettyMessage.RegisterProto message = (NettyMessage.RegisterProto) msg;

                    //todo 处理业务逻辑

            }

}

netty结合protobuf使用,传输层就介绍完了。见4 直播间解码

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容