使用 CppComet 创建简单的聊天






4.60/5 (5投票s)
使用 CppComet 创建一个简单的聊天程序。CppComet 是一个开源的 Comet 服务器。它用 C++ 编写。
引言
Comet 技术 - 允许通过服务器主动发送任意消息给客户端。
CppComet 是一个开源的 Comet 服务器,采用 AGPL 许可证。它用 C++ 编写,并使用 MySQL 存储数据。使用 CppComet,我们可以通过 WebSocket 从服务器(例如,从 PHP 代码)传递消息,并在 JavaScript 中接收它们。
它比一开始看起来要简单。在本文中,我们将使用 PHP 和 CppComet 创建一个简单的聊天程序。
背景
- 在线聊天演示
- JavaScript API 文档
- Github  CppComet的代码仓库
- Github 聊天示例代码仓库
- CometQL 文档
- JavaScript API 文档
从源代码构建
推荐安装到 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 代码仓库中创建问题。
聊天方案
典型的聊天方案

- 通过 WebSocket 连接到 Comet 服务器
- 发送 Ajax 消息以将新消息添加到聊天中
- 将消息添加到数据库
- 将消息发送到 CppComet
- 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 日:初始版本

