spice client 和 spice server 通信机制(2)
时间:2025-07-08
时间:2025-07-08
客户端启动后会首先与服务器建立连接,此连接即为MAIN_CHANNEL,MAIN_CHANNEL建立起来之后,客户端首先向服务器发送查询命令,请求服务器支持的Channel类型,然后客户端对所有支持的Channel一一创建对应的Channel类实例,每个实例都会开启自己的工作线程并向服务端发起连接请求,建立网络连接,下面是大致的工作流程及相关代码:
1、客户端首先会与服务器之间建立一个MAIN_CHANNEL,客户端一侧表现为RedClient,此Channel由客户端主动发起创建:
Application构造函数初始化时会初始化其RedClient成员_client,RedClient初始化时就会启动RedChannel类的start函数来创建工作线程,
具体的网络连接操作在工作线程的主循环内部完成,具体由RedChannelBase基类实现的connect、link两个函数来实现网络连接的建立和Channellink的建立。工作线程的主循环只处理简单的几个事件,其余消息处理交给其成员ProcessLoop的消息循环来完成。
2、MAIN_CHANNEL建立后,客户端RedClient进入其ProcessLoop的消息循环,等待服务端消息。服务端完成MAIN_CHANNEL相关工作的初始化(主要就是向Qemu注册一个网络消息处理结点,具体参见select网络模型中关于Watch的讲解)后,会通过此Channel发送
SPICE_MSG_MAIN_INIT消息,告知客户端可以进行后续的初始化工作了。
3、客户端执行初始化工作后,会发送消息请求支持的Channel列表,服务端将注册(参见下面Server端Channel实现)的Channel列表发送给客户端,并通知客户端创建Channel。
4、客户端其余Channel的创建都通过一个统一的接口,从工厂类中生产各个Channel类实例。参见具体实现如下(略去部分检查代码):
voidRedClient::create_channel(uint32_ttype,uint32_tid)
{
ChannelFactory*factory=find_factory(type);
RedChannel*channel=factory->construct(*this,id);
上一篇:京津SCAD系统简介