Qt/E服务器到客户端的消息传递
2010-07-22 14:27
323 查看
前面提到的服务器最重要的功能就是对鼠标,键盘,屏幕等资源进行分配管理,尤其是要独占鼠标,键盘等设备,因此服务器要把各种底层设备消息通知到各个客户端进程,目前主流的GUI平台都无一例外采用事件驱动模型,这些消息正是其事件的主要来源,在其内部表示为QWSEvent,所有具体的消息(事件)都是其子类,下图给出了所有的消息(事件):
![](http://images.cnblogs.com/cnblogs_com/baizx/A3DC6AC62254D3E5E7522A8AAD8057FCE3E5244C.jpg)
这里面有很多事件是非常直观的,比如键盘事件,鼠标事件等,而有一些事件就不那么直观了,很难看明白,像QWSConnectedEvent,QWSPropertyReplyEvent等,他们有的是为了客户端和服务器之间通信的辅助性事件,比如QWSConnectedEvent,而像QWSPropertyReplyEvent,则是Qt内部管理的需要,与物理设备像鼠标,键盘,屏幕没有关系,在移植过程中也不会涉及,并且也很少直接与这些事件打交道,因此就不再深入分析了,但是这些事件的传递过程是一样的。
这里以鼠标事件QWSMouseEvent为例来讲解,事件如何从服务器传递到客户端。我们知道服务器和客户端的通信和网络通信是一样的,必须将数据串行化才能进行传递。服务器进程将QWSEvent串行化(具体过程见前一节分析),然后发送到客户端进程,而客户端进程则进行相反的工作,依据串行化的字节序列,建立起一个QWSEvent对象实例。QWSEvent的反串行化的过程,是典型的工厂模式的应用(Qt中有很多典型的设计模式的使用范例),具体流程如下:
![](http://images.cnblogs.com/cnblogs_com/baizx/30788EEC90196644C0E767DC3CFBF2221E5AD96D.jpg)
Qt中有不少地方用到了工厂模式,这里使用的模式还是比较典型的,值得学习一下。
QWSEvent *QWSEvent::factory(int type)
{
QWSEvent *event = 0;
switch (type) {
……
case QWSEvent::Mouse:
event = new QWSMouseEvent;
break;
default:
qCritical("QWSEvent::factory() : Unknown event type %08x!", type);
}
return event;
}
![](http://images.cnblogs.com/cnblogs_com/baizx/A3DC6AC62254D3E5E7522A8AAD8057FCE3E5244C.jpg)
这里面有很多事件是非常直观的,比如键盘事件,鼠标事件等,而有一些事件就不那么直观了,很难看明白,像QWSConnectedEvent,QWSPropertyReplyEvent等,他们有的是为了客户端和服务器之间通信的辅助性事件,比如QWSConnectedEvent,而像QWSPropertyReplyEvent,则是Qt内部管理的需要,与物理设备像鼠标,键盘,屏幕没有关系,在移植过程中也不会涉及,并且也很少直接与这些事件打交道,因此就不再深入分析了,但是这些事件的传递过程是一样的。
这里以鼠标事件QWSMouseEvent为例来讲解,事件如何从服务器传递到客户端。我们知道服务器和客户端的通信和网络通信是一样的,必须将数据串行化才能进行传递。服务器进程将QWSEvent串行化(具体过程见前一节分析),然后发送到客户端进程,而客户端进程则进行相反的工作,依据串行化的字节序列,建立起一个QWSEvent对象实例。QWSEvent的反串行化的过程,是典型的工厂模式的应用(Qt中有很多典型的设计模式的使用范例),具体流程如下:
![](http://images.cnblogs.com/cnblogs_com/baizx/30788EEC90196644C0E767DC3CFBF2221E5AD96D.jpg)
Qt中有不少地方用到了工厂模式,这里使用的模式还是比较典型的,值得学习一下。
QWSEvent *QWSEvent::factory(int type)
{
QWSEvent *event = 0;
switch (type) {
……
case QWSEvent::Mouse:
event = new QWSMouseEvent;
break;
default:
qCritical("QWSEvent::factory() : Unknown event type %08x!", type);
}
return event;
}
相关文章推荐
- (61)从零开始学习Nodejs[3]——Node TCP服务器&telnet,多客户端消息传递改进
- QT 之 TCP/IP 服务器和客户端(二)(简单的字符串传递版本)
- BROKER服务器同客户端和应用服务器三者之间传递消息的格式定义
- Qt/E客户端到服务器命令的传递
- eMule协议规范 附录 A - 消息编码 客户端服务器TCP消息
- 使用HttpURLConnection实现在android客户端和服务器之间传递对象
- Java-WebSocket 项目的研究(二) :客户端连接服务器并发送消息实例
- 客户端请求消息与服务器响应消息的图表格式
- socket实现客户端聊天以及服务器消息推送
- Socket编程服务器不能打印客户端发送的消息
- Qt5--局域网内通信-单服务器多客户端
- unix网络编程卷一: 第五章:服务器反射客户端消息(一)
- ServerSocket和Socket建立通信(客户端发送消息服务器接收并返回到客户端接收输出)
- QTcpSocket类 客户端/服务器模式
- 用Mailslot写的客户端和服务器,客户端能向服务器多次发送消息,而服务器可以显示客户端发来的消息
- RTSP点播消息流程实例(客户端:VLC, RTSP服务器:LIVE555 Media Server)
- iOS 服务器对接友盟消息推送生产环境推送失败(客户端接受不到推送消息)
- Qt5 基于TCP传输的发送/接收文件服务器(支持多客户端)
- Enter-PSSession : 连接到远程服务器失败,错误消息如下: WinRM 客户端无法处理该请求
- HTML5支持服务器发送事件(Server-Sent Events)-单向消息传递数据推送(C#示例)