Qt/E客户端到服务器命令的传递

简介:     服务器负责各种资源的统一管理,而客户端则是各种为用户进行各种服务的地方,用户的各种请求都是在客户端进行真正的处理。而客户端在计算完毕以后要输出结果则必须通过服务器进行。客户端到服务器的请求是表现为QWSCommand的实例,数据通道仍然是Unix域socket。

    服务器负责各种资源的统一管理,而客户端则是各种为用户进行各种服务的地方,用户的各种请求都是在客户端进行真正的处理。而客户端在计算完毕以后要输出结果则必须通过服务器进行。客户端到服务器的请求是表现为QWSCommand的实例,数据通道仍然是Unixsocket。下图列出了客户端到服务器的所有请求,这些请求大部分是使用Qt开发的程序员无须知道的,在移植Qt的过程中也无需做任何改动。

img_074c8970e3e93f9e3c11d9d9488b3c0d.jpe

    客户端到服务器的通信过程同服务器到客户端的通信一样,首先是串行化,通过socket发送,到了服务器端,服务器再反串行化得到QWSCommand的实例。读者可能注意到QWSCommandQWSEvent都是继承与QWSProtocolItem,实际上串行化的工作由QWSProtocolItem提供,而QWSCommand的子类使用它提供的函数将自己特定的数据串行化。下面给出了QWSCommand的原型,结构非常简单,主要是定义了Command的类型以及制造Command的工厂函数,这里的factory和前面讲到的QWSEvent方式是一样的,就不赘述了。

struct QWSCommand : QWSProtocolItem

{

    QWSCommand(int t, int len, char *ptr) : QWSProtocolItem(t,len,ptr) {}

    enum Type {

        Unknown = 0,

……

        GrabMouse,

……

    };

    static QWSCommand *factory(int type);

};

    接下来我们以QWSGrabMouseCommand为例来讲解客户端到服务器的请求的传递过程,流程图见下图

img_7b65ae951734ae4978692b23c6c8ea38.jpe

 

QWSGrabMouseCommand是客户端想独自占有鼠标时发出的请求。windowidQt内部表示的窗口ID,每一个command都包含该id。grab如果为true表示请求占有鼠标,为false则表示请求释放鼠标,下面给出了QWSGrabMouseCommand的原型。

struct QWSGrabMouseCommand : public QWSCommand

{

    QWSGrabMouseCommand() :

        QWSCommand(QWSCommand::GrabMouse,

                    sizeof(simpleData), reinterpret_cast<char *>(&simpleData)) {}

 

    struct SimpleData {

        int windowid;

        bool grab;  // grab or ungrab?

    } simpleData;

};

服务器在检测到与客户端的连接有数据到来以后需要首先反串行化,然后依据具体的请求做出相应的处理。具体流程见下图:

 

img_2c411a9df7eb6636a370260d9d4fea04.jpe

 

目录
相关文章
|
2月前
|
安全 Linux Shell
使用SCP命令在CentOS 7上向目标服务器传输文件
以上步骤是在CentOS 7系统上使用SCP命令进行文件传输的基础,操作简洁,易于理解。务必在执行命令前确认好各项参数,尤其是目录路径和文件名,以避免不必要的传输错误。
216 17
|
3月前
|
Linux 网络安全 数据安全/隐私保护
使用Linux系统的mount命令挂载远程服务器的文件夹。
如此一来,你就完成了一次从你的Linux发车站到远程服务器文件夹的有趣旅行。在这个技术之旅中,你既探索了新地方,也学到了如何桥接不同系统之间的距离。
402 21
|
5月前
|
JSON API 数据安全/隐私保护
使用curl命令在服务器上执行HTTP请求
总的来说,curl是一个非常强大的工具,它可以让你在命令行中发送各种类型的HTTP请求。通过学习和实践,你可以掌握这个工具,使你的工作更加高效。
366 30
|
6月前
|
弹性计算 人工智能 运维
摆脱繁琐命令-让运维更加流畅-阿里云ECS操作系统控制台运维篇
阿里云操作系统控制台提供了便捷的服务器监控与管理功能,简化了运维工作。通过将多台服务器纳入统一监控平台,用户可以快速查看CPU、内存、磁盘和网络等关键资源的使用情况,避免了逐一远程连接查询的繁琐操作。此外,该工具支持自动化数据汇总,极大地方便了日报、周报和月报的编写。测试过程中,系统展示了良好的稳定性和响应速度,尤其在网络抖动和大文件健康状态测试中表现出色。整体体验流畅,显著提升了运维效率。 操作系统控制台地址:[点击访问](https://alinux.console.aliyun.com/)
172 26
摆脱繁琐命令-让运维更加流畅-阿里云ECS操作系统控制台运维篇
|
6月前
|
Java 网络安全 Apache
SshClient应用指南:使用org.apache.sshd库在服务器中执行命令。
总结起来,Apache SSHD库是一个强大的工具,甚至可以用于创建你自己的SSH Server。当你需要在服务器中执行命令时,这无疑是非常有用的。希望这个指南能对你有所帮助,并祝你在使用Apache SSHD库中有一个愉快的旅程!
343 29
|
5月前
|
人工智能 搜索推荐 程序员
用 Go 语言轻松构建 MCP 客户端与服务器
本文介绍了如何使用 mcp-go 构建一个完整的 MCP 应用,包括服务端和客户端两部分。 - 服务端支持注册工具(Tool)、资源(Resource)和提示词(Prompt),并可通过 stdio 或 sse 模式对外提供服务; - 客户端通过 stdio 连接服务器,支持初始化、列出服务内容、调用远程工具等操作。
1347 4
|
6月前
|
Kubernetes API 网络安全
当node节点kubectl 命令无法连接到 Kubernetes API 服务器
当Node节点上的 `kubectl`无法连接到Kubernetes API服务器时,可以通过以上步骤逐步排查和解决问题。首先确保网络连接正常,验证 `kubeconfig`文件配置正确,检查API服务器和Node节点的状态,最后排除防火墙或网络策略的干扰,并通过重启服务恢复正常连接。通过这些措施,可以有效解决与Kubernetes API服务器通信的常见问题,从而保障集群的正常运行。
386 17
|
6月前
|
网络协议 开发者 Python
Socket如何实现客户端和服务器间的通信
通过上述示例,展示了如何使用Python的Socket模块实现基本的客户端和服务器间的通信。Socket提供了一种简单且强大的方式来建立和管理网络连接,适用于各种网络编程应用。理解和掌握Socket编程,可以帮助开发者构建高效、稳定的网络应用程序。
257 10
|
8月前
|
存储 开发工具 git
[Git] 深入理解 Git 的客户端与服务器角色
Git 的核心设计理念是分布式,每个仓库既可以是客户端也可以是服务器。通过 GitHub 远程仓库和本地仓库的协作,Git 实现了高效的版本管理和代码协作。GitHub 作为远程裸仓库,存储项目的完整版本历史并支持多客户端协作;本地仓库则通过 `.git` 文件夹独立管理版本历史,可在离线状态下进行提交、回滚等操作,并通过 `git pull` 和 `git push` 与远程仓库同步。这种分布式特性使得 Git 在代码协作中具备强大的灵活性和可靠性。
185 18
[Git] 深入理解 Git 的客户端与服务器角色
|
9月前
|
存储 人工智能 自然语言处理
ChatMCP:基于 MCP 协议开发的 AI 聊天客户端,支持多语言和自动化安装 MCP 服务器
ChatMCP 是一款基于模型上下文协议(MCP)的 AI 聊天客户端,支持多语言和自动化安装。它能够与多种大型语言模型(LLM)如 OpenAI、Claude 和 OLLama 等进行交互,具备自动化安装 MCP 服务器、SSE 传输支持、自动选择服务器、聊天记录管理等功能。
2305 16
ChatMCP:基于 MCP 协议开发的 AI 聊天客户端,支持多语言和自动化安装 MCP 服务器

热门文章

最新文章

推荐镜像

更多
  • qt