Upload
kelsie-raymond
View
47
Download
3
Embed Size (px)
DESCRIPTION
客户端分拆方案. jarjar 2005.10. 各个模块. 播放插件( ChaosFilter 和 NetworkProxy ) NetworkProxy 从 NetworkStub 读取数据 交给 ChaosFilter 播放 ChaosFilter 根据播放状态调用 NetworkProxy 控制 本地进程 本地进程( LocalServer 和 NetworkStub ) NetworkStub 从 Layer1 读取数据,然后 Push 给 NetworkProxy LocalServer 负责给用户 显示信息 - PowerPoint PPT Presentation
Citation preview
客户端分拆方案
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
Layer1
播放插件
客户端各个模块关系图
+Request()+Stop()+GetData()+SendMsgToShow()
NetworkProxy
ChaosFilter
NetworkStub
-> 开始下载
-> 停止下载
-> 获取数据
-> 显示讯息
-> 获取讯息
-> 初始化
-> 开始下载
-> 停止下载
-> 获取数据
-> 此次缓冲结束
-> 获取缓冲进度
-> 获取传输信息
-> 获取频道名称
-> 获取频道码率
<- 显示讯息
中转调用( Message )
+Init()()+Request()+Stop()+GetData()+BufferFinished()+GetBufferPercent()+GetTransferInfo()+GetFileName()+GetBitRate()
Layer1
本地进程
+Request()+Stop()+GetData()+SendMsgToShow()+CheckBufferPercent()
ChannelManager
-> 开始下载
-> 停止下载
-> 获取数据
-> 显示讯息
LocalServer
+ShowMessage()
ChaosUI
<- 请求下载
-> 创建
Update-> 启动升级进程并等待升级完成
<- 创建
->
获取讯
息
简单流程
• 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
Proxy Stub
Message
Audio
Video
声音和视频要分开传输,因为数据不是严格同步的。分开之后,使用阻塞的 Socket 更加方便。
流程 : (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 显示信息。
不允许同时打开一个以上的 player 播放同一个频道。每个 Proxy 有一个接收消息的 Window (随机名字), Local Server 有一个接收消息的 Window(固定名字),都可以通过 FindWindow 查找。
例外情况• 播放插件进程被突然中止
– 本地进程每隔一段时间检查每个播放插件的线程是否还存在。
• 本地进程进程被突然中止– 播放插件每隔一段时间检查网络程序是否存在。
如果不存在,则重复启动过程,并且准备接受新的播放位置(可能有些难度)。
播放插件内部结构The Filter
Video Pin读取 Socket 播放
Audio Pin读取 Socket 播放 NetworkProxy
检查网络程序是否存在(准备好重新启动播放的流程)
根据播放状态控制网络程序
多语言切换
本地进程结构The EXE
显示信息(托盘图标 / 菜单 / 气泡)
(类 QQ 的通知窗口)
NetworkStub A多语言切换
定时启动自动升级定时检查每个播放
插件是否存在
检查缓冲进度
NetworkStub B
检查缓冲进度
Layer1 结构The EXE
TrackServer 通讯
管理 P2P 连接下载数据并存储到缓冲文件
对外接口
多语言切换
升级程序The Updater
检查是否最新版本
下载并解压最新版本
提示用户关闭占用目标文件的进程
覆盖目标文件,安装完成 等待目标进程退出,覆盖目标文件
关闭 不关闭
多语言切换
多语言• 使用类似 ini 文件的格式• 比如
– Jpn.ini• IDE_1=“ ソフトウェア ”
– Eng.ini• IDE_1=“good good”
– Chn.ini• IDE_1=“ 好好”
• 自动检测操作系统使用的语言调用相应的 ini 文件,如果没有,则使用默认的 ini 文件。