1、一点背景知识
1.1 RFB协议
RFB ( Remote Frame Buffer 远程帧缓冲) 协议是一个用于远程访问图形用户界面的简单协议。由于 RFB 协议工作在帧缓冲层,因此它适用于所有的窗口系统和应用程序,如 Windows 3.1/95/NT 和 Macintosh 等。 RFB协议最显著的特点在于,它只负责从帧缓冲区中获取显示更新及Server端和Client端的数据交互,使客户机处理的任务尽可能减少。RFB协议对于客户端是无状态的。
1.2 VNC协议
VNC(Virtual Network Computing)是基于RFB(Remote Frame Buffer)协议进行通信,是一个基于平台无关的简单显示协议的超级瘦客户系统。VNC viewer就是实现VNC协议一个常用的软件。
1.3 H264
H.264是国际标准化组织(ISO)和国际电信联盟(ITU)共同提出的继MPEG4之后的新一代数字视频压缩格式。H264常用于视频编码,有关H264的介绍网络上比较好的博客有雷神的这个专栏。
1.4 H264编码流对RFB封装的实现
H264能实现对RFB封装的是基于H264的分层结构和RFB的可扩展性。具体做法是在系统服务器端初始化时扩展自己的编码方式到RFB支持的编码列表中,然后将RFB协议的FrameBufferUpdate消息头和待编码矩形结构信息添加到H264编码流之前。
2、具体实现
2.1 UML图
给出一张核心类关系图
2.2 时序图
main.cpp
H264Protocol.cpp
Server.cpp
ServerTcpConnection.cpp
TcpConnection.hpp
TcpConnection.cpp
SessionHandler.cpp
AviChannel.cpp
Connection.cpp
Session.cpp
Channel.cpp
KeyChannel.cpp
MouseChannel.cpp
MotionChannel.cpp
SettingChannel.cpp
QemuChannel.cpp
RawDataChannel.cpp
init()
分配内存
new Server()
Start()
DoAccept()
Start()
AsyncRead()
HandlePreface()
虚线箭头代表回调走向
HandleAuthentication()
StartParser()
WaitForMessage()
CreateSession()
new SessionHandler()
Start()
start()
new thread()
h264EncodeThreadFunc()
encodeH264()
SendH264()
SendMessage()
经过包解析,由SessionHandler
来处理每个channel里的数据
这里的流程经过简化
ParseRecvMsg()
OnMessage()
GetKeyChannel()
HandleBuffer()
OnKeyEvent()
GetKeyChannel()
HandleBuffer()
OnMouseEvent()
GetMotionChannel()
HandleBuffer()
OnMotionEvent()
GetSettingChannel()
HandleBuffer()
OnSettingEvent()
GetQemuChannel()
HandleBuffer()
OnQemuEvent()
GetRawDataChannel()
HandleBuffer()
OnRawDataEvent()
main.cpp
H264Protocol.cpp
Server.cpp
ServerTcpConnection.cpp
TcpConnection.hpp
TcpConnection.cpp
SessionHandler.cpp
AviChannel.cpp
Connection.cpp
Session.cpp
Channel.cpp
KeyChannel.cpp
MouseChannel.cpp
MotionChannel.cpp
SettingChannel.cpp
QemuChannel.cpp
RawDataChannel.cpp
2.3 一些说明
对初级socket编程来说,我们通常创建好socket就可以开始收发数据了。在本文中,一个socket被抽象成多路connection,一路connection里面分了许多channel,如:KeyChannel、KeyChannel等等。在协议设计的时候,就需要把每一路channel占用第几字节到第几字节定义好,服务器和客户端根据这个定义来组包和解包。由于编码的底层基于boost库里的TCP实现,所以仍然是对TCP协议的封装。
|