110 likes | 226 Views
客户端分拆方案. jarjar 2005.10. 各个模块. 播放插件( ChaosFilter 和 NetworkProxy ) NetworkProxy 从 NetworkStub 读取数据 交给 ChaosFilter 播放 ChaosFilter 根据播放状态调用 NetworkProxy 控制 本地进程 本地进程( LocalServer 和 NetworkStub ) NetworkStub 从 Layer1 读取数据,然后 Push 给 NetworkProxy LocalServer 负责给用户 显示信息
E N D
客户端分拆方案 jarjar 2005.10
各个模块 • 播放插件(ChaosFilter和NetworkProxy) • NetworkProxy从NetworkStub读取数据交给ChaosFilter播放 • ChaosFilter根据播放状态调用NetworkProxy控制本地进程 • 本地进程(LocalServer和NetworkStub) • NetworkStub从Layer1读取数据,然后Push给NetworkProxy • LocalServer负责给用户显示信息 • LocalServer支持同时与多个播放插件进行交互 • Layer1 • 负责下载数据并存储到缓冲文件 • 多语言 • 独立的DLL,提供从ID到String的查找 • 升级程序 • 负责检查程序版本是否最新 • 负责下载最新程序并解压,同时显示下载进度 • 安装过程中能够提示用户关闭占用目标文件的进程,给出列表 • 其他 • NetworkProxy和NetworkStub通信使用Socket或者Windows Message
客户端各个模块关系图 播放插件 Update ->启动升级进程并等待升级完成 ->开始下载 ->停止下载 ->获取数据 ->显示讯息 <-请求下载 中转调用(Message) 本地进程 Layer1 ->开始下载 ->停止下载 ->获取数据 ->显示讯息 ->初始化 ->开始下载 ->停止下载 ->获取数据 ->此次缓冲结束 ->获取缓冲进度 ->获取传输信息 ->获取频道名称 ->获取频道码率 <-显示讯息 -> 获取讯息 <-创建 ->创建 -> 获取讯息
简单流程 • ChaosFilter call NetworkProxy::Request() • NetworkProxy execute update process and wait until update finished. • NetworkProxy connect to LocalServer • LocalServer new ChannelMgr, and pass socket_from_proxy and ChaosUI to ChannelMgr. • ChannelMgr new NetworkStub, and pass socket_from_proxy to NetworkStub. • Stub Read call from socket. • Stub call ChannelMgr::Request()
Proxy & Stub Message Proxy Stub 声音和视频要分开传输,因为数据不是严格同步的。分开之后,使用阻塞的Socket更加方便。 不允许同时打开一个以上的player播放同一个频道。 Audio 每个Proxy有一个接收消息的Window(随机名字),Local Server有一个接收消息的Window(固定名字),都可以通过FindWindow查找。 Video 流程: (Local Server = LS) Proxy启动升级程序,等待升级程序退出(升级完毕)。 Proxy发送MSG(包含gtv url和Proxy接收消息的窗口名)给LS。 LS初始化一个Stub,Stub初始化一个Layer1。Stub发送MSG告知Proxy初始化失败或者成功。 Proxy连接上LS,说明自己属于某个Stub。LS将连接交给Stub。 Stub从Layer1读取数据,分视频/音频通过Socket发送给Proxy。Proxy开始播放。 Proxy发送MSG通知Stub停止播放。Stub释放Layer1及自身。 辅助: Proxy和Layer1将要显示的消息发送给Stub, Stub交给LS显示。 Stub发现Layer1的数据不足,开始循环检查缓冲进度(同时交给LS显示),缓冲结束后通知Layer1。 异常: Stub初始化Layer1失败,通知Proxy停止播放,交给LS显示信息。 Layer1下载过程中发生致命错误,通知Stub,Stub通知Proxy停止播放,交给LS显示信息。
例外情况 • 播放插件进程被突然中止 • 本地进程每隔一段时间检查每个播放插件的线程是否还存在。 • 本地进程进程被突然中止 • 播放插件每隔一段时间检查网络程序是否存在。如果不存在,则重复启动过程,并且准备接受新的播放位置(可能有些难度)。
播放插件内部结构 The Filter 多语言切换 Video Pin 读取Socket播放 Audio Pin 读取Socket播放 NetworkProxy 检查网络程序是否存在 (准备好重新启动播放的流程) 根据播放状态控制网络程序
本地进程结构 The EXE 多语言切换 NetworkStub A 检查缓冲进度 定时启动自动升级 定时检查每个播放 插件是否存在 NetworkStub B 显示信息 (托盘图标/菜单/气泡) (类QQ的通知窗口) 检查缓冲进度
Layer1结构 The EXE 多语言切换 TrackServer通讯 对外接口 管理P2P连接 下载数据并存储到缓冲文件
升级程序 The Updater 多语言切换 检查是否最新版本 下载并解压最新版本 提示用户关闭占用目标文件的进程 关闭 不关闭 覆盖目标文件,安装完成 等待目标进程退出,覆盖目标文件
多语言 • 使用类似ini文件的格式 • 比如 • Jpn.ini • IDE_1=“ソフトウェア ” • Eng.ini • IDE_1=“good good” • Chn.ini • IDE_1=“好好” • 自动检测操作系统使用的语言调用相应的ini文件,如果没有,则使用默认的ini文件。