使用 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 日:初始版本