欢迎关注公众号:冒泡的肥皂
上篇文章中介绍了Message Headerd的数据结构和内容解析。里面有个字段message type,后续的数据解析和信息交互是通过它来的。
一些协议说明
解析样例
switch (messageTypeId) {
//协议控制消息 1,设置块大小,以通知对端一个新的最大块大小。
case RtmpDict.MSG_SET_CHUNK_SIZE: {
int readInt = payload.readInt();
SetChunkSize setChunkSize = new SetChunkSize();
setChunkSize.setChunkSize(readInt);
result = setChunkSize;
}
break;
//协议控制消息 2,终止消息,用于通知对端,
//如果对端在等待去完成一个消息的块的话,然后抛弃一个块流中已接受到的部分消息。
//对端接收到块流 ID 作为当前协议消息的有效负载。
//一些程序可能会在关闭的时候使用这个消息以指示不需要进一步对这个消息的处理了。
case RtmpDict.MSG_ABORT_MESSAGE: {
int csid = payload.readInt();
Abort abort = new Abort(csid);
result = abort;
}
break;
//确认 3
//客户端或者服务器在接收到等同于窗口大小的字节之后必须要发送给对端一个确认。
//窗口大小是指发送者在没有收到接收者确认之前发送的最大数量的字节。这个消息定义了序列号,也就是目前接收到的字节数。
case RtmpDict.MSG_ACKNOWLEDGEMENT: {
int ack = payload.readInt();
result = new Acknowledgement(ack);
}
break;
//窗口确认大小 5
//客户端或者服务器端发送这条消息来通知对端发送和应答之间的窗口大小。
//发送者在发送完窗口大小字节之后期待对端的确认。接收端在上次确认发送后接收到的指示数值后,或者会话建立之后尚未发送确认,必须发送一个确认 (5.4.3 小节)。
case RtmpDict.MSG_WINDOW_ACKNOWLEDGEMENT_SIZE: {
int size = payload.readInt();
result = new WindowAcknowledgementSize(size);
}
break;
//设置对端带宽 6
//客户端或者服务器端发送这一消息来限制其对端的输出带宽。
//对端接收到这一消息后,将通过限制这一消息中窗口大小指出的已发送但未被答复的数据的数量以限制其输出带宽。
//接收到这一消息的对端应该回复一个窗口确认大小消息,如果这个窗口大小不同于其发送给 (设置对端带宽) 发送者的最后一条消息。
case RtmpDict.MSG_SET_PEER_BANDWIDTH: {
int ackSize = payload.readInt();
int type = payload.readByte();
result = new SetPeerBandwidth(ackSize, type);
}
break;