11
客客客客客客客 jarjar 2005.10

客户端分拆方案

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

Page 1: 客户端分拆方案

客户端分拆方案

jarjar

2005.10

Page 2: 客户端分拆方案

各个模块• 播放插件( ChaosFilter 和 NetworkProxy )

– NetworkProxy 从 NetworkStub 读取数据交给 ChaosFilter 播放– ChaosFilter 根据播放状态调用 NetworkProxy 控制本地进程

• 本地进程( LocalServer 和 NetworkStub )– NetworkStub 从 Layer1 读取数据,然后 Push 给 NetworkProxy– LocalServer 负责给用户显示信息– LocalServer 支持同时与多个播放插件进行交互

• Layer1– 负责下载数据并存储到缓冲文件

• 多语言– 独立的 DLL ,提供从 ID 到 String 的查找

• 升级程序– 负责检查程序版本是否最新– 负责下载最新程序并解压,同时显示下载进度– 安装过程中能够提示用户关闭占用目标文件的进程,给出列表

• 其他– NetworkProxy 和 NetworkStub 通信使用 Socket 或者 Windows Message

Page 3: 客户端分拆方案

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-> 启动升级进程并等待升级完成

<- 创建

->

获取讯

Page 4: 客户端分拆方案

简单流程

• 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()

Page 5: 客户端分拆方案

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 查找。

Page 6: 客户端分拆方案

例外情况• 播放插件进程被突然中止

– 本地进程每隔一段时间检查每个播放插件的线程是否还存在。

• 本地进程进程被突然中止– 播放插件每隔一段时间检查网络程序是否存在。

如果不存在,则重复启动过程,并且准备接受新的播放位置(可能有些难度)。

Page 7: 客户端分拆方案

播放插件内部结构The Filter

Video Pin读取 Socket 播放

Audio Pin读取 Socket 播放 NetworkProxy

检查网络程序是否存在(准备好重新启动播放的流程)

根据播放状态控制网络程序

多语言切换

Page 8: 客户端分拆方案

本地进程结构The EXE

显示信息(托盘图标 / 菜单 / 气泡)

(类 QQ 的通知窗口)

NetworkStub A多语言切换

定时启动自动升级定时检查每个播放

插件是否存在

检查缓冲进度

NetworkStub B

检查缓冲进度

Page 9: 客户端分拆方案

Layer1 结构The EXE

TrackServer 通讯

管理 P2P 连接下载数据并存储到缓冲文件

对外接口

多语言切换

Page 10: 客户端分拆方案

升级程序The Updater

检查是否最新版本

下载并解压最新版本

提示用户关闭占用目标文件的进程

覆盖目标文件,安装完成 等待目标进程退出,覆盖目标文件

关闭 不关闭

多语言切换

Page 11: 客户端分拆方案

多语言• 使用类似 ini 文件的格式• 比如

– Jpn.ini• IDE_1=“ ソフトウェア ”

– Eng.ini• IDE_1=“good good”

– Chn.ini• IDE_1=“ 好好”

• 自动检测操作系统使用的语言调用相应的 ini 文件,如果没有,则使用默认的 ini 文件。