C++REST SDK WebSocket客户端

C++ Stand SDK 2.1发布 ,我们很高兴宣布支持跨多个平台(Linux、OSX、iOS、Windows桌面和商店)的客户端WebSocket。这是一个相对较新的协议,通过TCP提供全双工通信。有关详细规格,请参阅 RFC 6455型 .

null

为什么要使用WebSocket

WebSocket在编写客户端和服务器之间需要低延迟双向通信的应用程序时非常方便。这适用于协作编辑应用程序、多人游戏或需要实时更新的应用程序。考虑一个stock ticker应用程序,其中客户机向服务器注册以监视不同公司的股票报价。在这种情况下使用HTTP需要客户端每隔几秒钟轮询一次请求以获取更新。而且,每个请求-响应都会伴随一些占用网络带宽的头。在这里使用WebSockets解决了这些问题:当服务器看到股票有任何变动时,它会向客户端发送更新(低延迟)。客户端不必向服务器发送任何“检查更新?”请求。当客户想要收听其他股票报价时,它可以注册更新(双向)。

WebSocket客户端实现在 web::实验::webu套接字::客户端 C++休眠SDK的命名空间。要从您的项目中引用SDK,请参阅我们的文档 码丛 . 在下面几节中,我们将介绍如何创建和执行websocket客户端操作:

连接到服务器

这涉及到客户机和服务器之间的开放握手,这只是一个HTTP升级请求,其中包含一些特定于WebSocket协议的头交换(Sec-WebSocket-Key,Sec-WebSocket-Version)。从服务器接收到预期的状态代码后,就建立了连接。

这个 websocket客户端::connect() API负责此握手。它返回一个任务,该任务在建立连接时完成:

websocket_client客户端(U(“ws://websocket_server_url”));

client.connect().wait();

发送和接收消息

websocket_client::send()和websocket_client::receive()API可用于发送和接收消息。该库支持文本和二进制消息。

websocket传出消息 表示要发送的消息。

这个 websocketu outgoingu message::setu utf8u消息 API(同时具有字符串和流重载)可用于构造文本消息。注意:如果数据实际上是UTF-8编码,则C++休眠SDK将不验证。

同样地 websocket传出消息::设置二进制消息 接口可用于构造二进制消息。

最后打电话给 websocketu客户端::发送(websocketu传出消息消息消息) 将消息发送到服务器的API。这将返回一个任务,该任务在消息移交给底层TCP层时完成。

要接收消息,请致电 websocket客户端::接收() 应用程序编程接口。当客户端端点接收到消息时,返回已完成的任务。 websocket传入消息 表示接收到的消息。您可以使用 提取字符串() (对于UTF-8消息类型)或body()(对于UTF-8或二进制消息类型)接口。

注意:呼叫 接收() 多次将启动挂起的接收并将它们排队。收到消息后,只有第一次接收将完成。

正在关闭连接

结束握手涉及客户端发送和接收结束控制帧。

这个 websocket客户端::关闭() API关闭websocket连接。

演示(文本聊天应用程序)

现在让我们看一个文本聊天应用程序,它演示了WebSockets的使用。

使用样本

这个示例由聊天客户端组成,它是一个 Windows应用商店应用程序 聊天服务器是一个控制台应用程序。首先在解决方案中构建ChatServer项目以生成CharServer.exe。打开命令提示符并运行ChatServer.exe以启动聊天服务器。 下面的屏幕截图显示了正在运行的ChatServer.exe .

接下来,构建和部署ChatClient项目并启动部署的应用程序。要使用聊天应用程序,您需要两个聊天客户端实例。由于windows应用商店应用程序在一台计算机上只能有一个实例,因此您需要将该应用程序部署到其他一些计算机上(或者作为一种黑客的替代方法,您可以在package.appxmanifest文件中更改该应用程序的标识,并使用其他标识进行部署)。请注意,在构建和部署ChatClient之前,必须根据运行CharServer.exe的位置更改CHAT SERVER URL宏(位于文件夹ChatClientServerCommon下的ProjectUtilities.h文件中)。下面的屏幕截图显示了启动后的ChatClient。

clip_image002

输入您的屏幕名称并单击连接。当第二个客户机连接时,第一个和第二个客户机将能够看到对方。要发送文字信息,请选择左侧面板上的联机用户并在聊天文本窗口中输入文字,然后单击“发送”发送信息。下面的屏幕截图显示了两个聊天客户端之间的聊天对话。

clip_image004

clip_image006

代码

聊天服务器是用 POCO C++库 和用途 HTTP升级机制 升级到WebSocket协议。这个文本聊天应用程序的重点是演示如何使用中添加的客户端WebSocket支持 C++静态SDK . 因此,我们将跳过聊天服务器代码的细节。聊天服务器在那里是因为应用程序需要它。

聊天客户端是一个C++窗口存储应用程序 C++/CX与XAML 用于UI。班级 客户经理 (请参阅文件夹ChatClientServerChatClient下的ClientManager.h和ClientManager.cpp文件)是应用程序的主要部分。它与聊天服务器和应用程序用户界面(参见文件夹ChatClientServerChatClient下的MainPage.xaml.h和MainPage.xaml.cpp文件)进行通信,并充当两者之间的桥梁。聊天客户端使用 JSON文件 表示聊天客户端和聊天服务器之间交换的数据(请参阅ChatClientServerCommon文件夹下的ServerClientPackets.h和ServerClientPackets.cpp文件)。

启动聊天客户端后,当用户单击“连接”按钮时,应用程序将与聊天服务器建立web套接字连接(请参见功能) 单击“连接”按钮 (…)在MainPage.xaml.cpp文件中),并开始侦听来自服务器的消息(请参见函数 收听u传入的u消息 () 文件ClientManager.cpp)。然后,客户端将用户信息发送到聊天服务器。当聊天服务器接收到用户信息时,它会发回已经连接到聊天服务器的用户列表(参见功能 连接() 文件ClientManager.cpp)。

函数 侦听u传入的u消息() 使用异步循环侦听来自聊天服务器的消息。每次迭代(即 pplx::任务<>) 异步循环处理来自聊天服务器的一条消息。处理完消息后,当前迭代会发出完成的信号,并为下一次迭代创建一个任务(请参见函数) 异步u do u while(…)、u do u while u迭代(…)和u do u while u impl(…) 在文件夹ChatClientServerCommon下的ProjectUtilities.cpp文件中。

当用户输入聊天文本并单击“发送”按钮时,聊天客户端将使用web套接字连接发送消息(请参阅函数) 发送聊天室文本(…) 文件ClientManager.cpp)。当用户想要断开与聊天服务器的连接并单击断开按钮时,聊天客户端首先向服务器发送消息,告知其要注销,然后关闭web套接字连接(请参阅函数) 断开() 在clientmanager.cpp文件中)。

你可以下载附件 包含示例的压缩文件 和它一起玩。请注意“.zip”中的示例代码 在Apache 2.0许可下发布 . 你需要 Visual Studio 2013 构建样本。该示例使用“Fix8 POCO dependency”NuGet包获取POCO依赖项。 我们希望听到您的评论如下。

Hasibur Rahman和Kavya Kotacherry,

Visual C++库团队。

ChatClientServer.zip文件

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享