65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 CppComet 创建简单的聊天

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.60/5 (5投票s)

2017年4月13日

MIT

3分钟阅读

viewsIcon

24591

使用 CppComet 创建一个简单的聊天程序。CppComet 是一个开源的 Comet 服务器。它用 C++ 编写。

引言

Comet 技术 - 允许通过服务器主动发送任意消息给客户端。

CppComet 是一个开源的 Comet 服务器,采用 AGPL 许可证。它用 C++ 编写,并使用 MySQL 存储数据。使用 CppComet,我们可以通过 WebSocket 从服务器(例如,从 PHP 代码)传递消息,并在 JavaScript 中接收它们。

它比一开始看起来要简单。在本文中,我们将使用 PHP 和 CppComet 创建一个简单的聊天程序。

背景

从源代码构建

推荐安装到 Ubuntu、Debian 或 Centos。我们将使用 Ubuntu。

apt-get update
apt-get install cmake make cpp gcc libssl-dev g++ nginx 
        libmysqlclient-dev mysql-server mysql-client flex mailutils uuid-dev
git clone https://github.com/Levhav/comet-server
cd comet-server
cmake .
make 

创建数据库

CppComet 使用 MySQL 数据库来存储用户凭据,以便在服务器上进行授权。并存储用户在线的时间。以及存储临时数据,例如未发送的消息和其他数据。

根据 db.sql 文件在 MySQL 中创建一个数据库。在 comet.conf 文件中,设置访问数据库的详细信息。

运行服务器

在控制台模式下运行

./cpp_comet

在守护进程模式下运行

systemctl start comet.service

添加到启动项

cp ./comet.service /etc/systemd/system
systemctl daemon-reload
systemctl enable comet.service 

成功后,运行服务器,我们可以开始创建聊天程序。如果在此步骤遇到错误,请在GitHub 代码仓库中创建问题

聊天方案

典型的聊天方案

  1. 通过 WebSocket 连接到 Comet 服务器
  2. 发送 Ajax 消息以将新消息添加到聊天中
  3. 将消息添加到数据库
  4. 将消息发送到 CppComet
  5. CppComet 向管道中的所有订阅者发送消息

步骤 1. 通过 JavaScript API 连接到 Comet 服务器

CppComet 拥有云 saas 替代方案,可用于测试和演示访问。在以下示例中,我将使用来自 https://comet-server.com 的演示访问权限,供那些无法或懒于在其 vps 上部署服务器的人使用。

Login: 15
Password:lPXBFPqNg3f661JcegBY0N0dPXqUBdHXqj2cHf04PZgLHxT6z55e20ozojvMRvB8
Host: app.comet-server.ru 

要通过 JavaScript API 连接到 Comet 服务器,请使用此命令

cometApi.start({node:"app.comet-server.ru", dev_id:15})
  • 在参数 node 中 - 设置您自己的服务器的主机名
  • 参数 dev_id - 仅在使用 saas 服务 comet-server.com 时使用

步骤 2.1 向服务器发送消息

向 PHP 后端发送 Ajax 查询

function sendMessage(name, text)
{ 
   $.ajax({
        url: "http://comet-server.org/doc/CppComet/chat-example/chat.php",
        type: "POST", 
        data:"text="+encodeURIComponent(text)+"&name="+encodeURIComponent(name)
   });
}

步骤 2.2 发送 CometQL 查询到 Comet 服务器

CometQL - 这是一个通过 MySQL 协议与 Comet 服务器一起工作的 API。(更多关于 CometQL 的信息)。

CometQL 的优点

  • 适用于 12 种以上编程语言的统一 API
  • 简单易懂的查询视图
  • PHP 包含用于维护与 MySQL 的持久连接的资源,现在,您可以将其用于与 Comet 服务器协同工作。

通过 MySQL 协议连接到 Comet 服务器

// Credentials for demo access
$host = "app.comet-server.ru";
$user = "15";
$password = "lPXBFPqNg3f661JcegBY0N0dPXqUBdHXqj2cHf04PZgLHxT6z55e20ozojvMRvB8";

// Connecting
$comet = mysqli_connect($host, $user, $password, "CometQL_v1");
if(mysqli_errno($comet))
{
    echo "Error:".mysqli_error($link);
}

发送 CometQL 查询到 Comet 服务器,以将消息发送给其他用户

// Receive data from $_POST array
$msg = Array( "name" => $_POST["name"], "text"  => $_POST["text"] );
$msg = json_encode($msg);
$msg = mysqli_real_escape_string($comet, $msg);

// Query string
$query = "INSERT INTO pipes_messages (name, event, message)" .
  "VALUES('simplechat', 'newMessage', '".$msg."')";

// Send query
mysqli_query($comet, $query); 
if(mysqli_errno($comet))
{
    echo "Error:".mysqli_error($comet);
}
else
{
    echo "ok";
}

步骤 3. 从 Comet 服务器接收消息

订阅代码 到 Comet 服务器上的管道。当有人将消息发送到带有事件名称 newMessage 的频道 simplechat 时,将调用此回调。

cometApi.subscription("simplechat.newMessage", function(event){
    $("#web_chat").append('<b>'+HtmlEncode(event.data.name)+'</b>')
    $("#web_chat").append('<i>'+HtmlEncode(event.data.text)+'</i>')
    $("#web_chat").append('<br>')
})

过滤接收到的数据的代码

function HtmlEncode(s)
{
  var el = document.createElement("div");
  el.innerText = el.textContent = s;
  s = el.innerHTML;
  return s;
}

摘要

在本文中,我介绍了使用 CppComet 创建一个简单的聊天程序。我希望它很有趣。

CppComet 项目有许多我们未在本文中使用的功能。它们是

  • 在 Comet 服务器上进行授权
  • 获取用户在线时间
  • 实时从 JavaScript API 跟踪用户状态
  • 从 JavaScript API 发送消息
  • 通过用户的 ID 向其发送私人消息
  • 以及其他功能

历史

  • 2017 年 4 月 13 日:初始版本
© . All rights reserved.