libpomelo使用

2023-10-05 14:42
文章标签 使用 libpomelo

本文主要是介绍libpomelo使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

客户端访问gate服务器,获得连接后再访问connect服务器

//pre define
#define GATE_HOST "127.0.0.1"
#define GATE_PORT 3014
#define MAX_LINE_CHARS 1024
#define MAX_RUN_NUM 5000000
#define END_STR "bye"
#define ROBOT_STR "robot"static const char *connectorHost = "";
static int connectorPort = 0;
static const char *user = "";
static const char *channel = "";
static pc_client_t *pomelo_client;
void login(const char *username, const char *Channel) {const char *ip = GATE_HOST;int port = GATE_PORT;user = username;channel = Channel;//init a clientpc_client_t *client = pc_client_new();// add some event callback.pc_add_listener(client, PC_EVENT_DISCONNECT, on_gate_close);// set the addressstruct sockaddr_in address;memset(&address, 0, sizeof(struct sockaddr_in));address.sin_family = AF_INET;address.sin_port = htons(port);address.sin_addr.s_addr = inet_addr(ip);printf("try to connect to gate server %s %d\n", ip, port); //debug // try to connect to server.if (pc_client_connect(client, &address)) {printf("fail to connect gate server.\n");pc_client_destroy(client);return;}// try to route const char *route = "gate.gateHandler.queryEntry";// make the json msgjson_t *msg = json_object();json_t *str = json_string(username);json_object_set_new(msg, "uid", str);// make requestpc_request_t *request = pc_request_new();pc_request(client, request, route, msg, on_request_gate_cb);
}

客户端收到gate返回的信息(connectorHost & connectorPort)on_request_gate_cb;进行重连接

void on_request_gate_cb(pc_request_t *req, int status, json_t *resp) {if (status == -1) {printf("Fail to send request to server.\n");} else if (status == 0) {// parse the msg getconnectorHost = json_string_value(json_object_get(resp, "host"));connectorPort = json_number_value(json_object_get(resp, "port"));//try to reconnectpc_client_t *client = pc_client_new_with_reconnect(1, 30, 1);struct sockaddr_in address;memset(&address, 0, sizeof(struct sockaddr_in));address.sin_family = AF_INET;address.sin_port = htons(connectorPort);address.sin_addr.s_addr = inet_addr(connectorHost);// add pomelo events listenerpc_add_listener(client, PC_EVENT_TIMEOUT, on_timeout);pc_add_listener(client, "disconnect", on_disconnect);pc_add_listener(client, "onChat", on_chat);pc_add_listener(client, "onAdd", on_add);pc_add_listener(client, "onLeave", on_leave);pc_add_listener(client, "reconnect", on_reconnect);printf("try to connect to connector server %s %d\n", connectorHost, connectorPort);//debug// try to connect to server.if (pc_client_connect(client, &address)) {printf("fail to connect connector server.\n");pc_client_destroy(client);return ;}//try routeconst char *route = "connector.entryHandler.enter";//msgjson_t *msg = json_object();json_t *str = json_string(user);json_t *channel_str = json_string(channel);json_object_set_new(msg, "username", str);json_object_set_new(msg, "rid", channel_str);//requestpc_request_t *request = pc_request_new();printf("%s %s\n", user, channel);pc_request(client, request, route, msg, on_request_connector_cb);}// release relative resource with pc_request_tjson_t *pc_msg = req->msg;pc_client_t *pc_client = req->client;json_decref(pc_msg);pc_request_destroy(req);pc_client_stop(pc_client);//stop wait for infomation
}

客户端连接到connector,connector返回用户信息

服务器端connectorHandler

module.exports = function(app) {return new Handler(app);
};var Handler = function(app) {this.app = app;
};var handler = Handler.prototype;/*** New client entry chat server.** @param  {Object}   msg     request message* @param  {Object}   session current session object* @param  {Function} next    next stemp callback* @return {Void}*/
handler.enter = function(msg, session, next) {var self = this;var rid = msg.rid;var uid = msg.username + '*' + ridvar sessionService = self.app.get('sessionService');//duplicate log inif( !! sessionService.getByUid(uid)) {next(null, {code: 500,error: true});return;}session.bind(uid);session.set('rid', rid);session.push('rid', function(err) {if(err) {console.error('set rid for session service failed! error is : %j', err.stack);}});session.on('closed', onUserLeave.bind(null, self.app));//put user into channelself.app.rpc.chat.chatRemote.add(session, uid, self.app.get('serverId'), rid, true, function(users){//here return all users informationnext(null, {users:users});});
};

摘要

        //put user into channelself.app.rpc.chat.chatRemote.add(session, uid, self.app.get('serverId'), rid, true, function(users){//here return all users informationnext(null, {users:users});

客户端响应函数on_request_connector_cb

void on_request_connector_cb(pc_request_t *req, int status, json_t *resp) {printf("on_request_connector_cb\n");if (status == -1) {printf("Fail to send request to server.\n");} else if (status == 0) {char *json_str = json_dumps(resp, 0);//print all users informationprintf("server response: %s \n", json_str);   //get msg json_t *users = json_object_get(resp, "users");if (json_object_get(resp, "error") != NULL) {printf("connect error %s", json_str);free(json_str);return;}//set the finall clientpomelo_client = req->client;printf("login chat ok\n");}// release relative resource with pc_request_tjson_t *msg = req->msg;pc_client_t *client = req->client;json_decref(msg);pc_request_destroy(req);//here not destroy the client
}

客户端发送消息

void msg_send(const char *message, const char *rid, const char *from, const char *target) {//routeconst char *route = "chat.chatHandler.send";//msgjson_t *msg = json_object();json_t *str = json_string(message);json_object_set_new(msg, "content", str);json_object_set_new(msg, "rid", json_string(rid));json_object_set_new(msg, "from", json_string(from));json_object_set_new(msg, "target", json_string(target));//requestpc_request_t *request = pc_request_new();pc_request(pomelo_client, request, route, msg, on_send_cb);
}void on_send_cb(pc_request_t *req, int status, json_t *resp) {if(status == 0){printf("on_send_cb ok\n");} else {printf("on_send_cb bad\n");}// release relative resource with pc_request_tjson_t *msg = req->msg;json_decref(msg);pc_request_destroy(req);
}

客户端接受消息(以on_chat为例)

void on_chat(pc_client_t *client, const char *event, void *data) {json_t *json = (json_t * )data;const char *msg = json_dumps(json, 0);printf("%s %s\n", event, msg);//here donot need to release, because the information is from the Server}

这篇关于libpomelo使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/151414

相关文章

使用Python开发Markdown兼容公式格式转换工具

《使用Python开发Markdown兼容公式格式转换工具》在技术写作中我们经常遇到公式格式问题,例如MathML无法显示,LaTeX格式错乱等,所以本文我们将使用Python开发Markdown兼容... 目录一、工具背景二、环境配置(Windows 10/11)1. 创建conda环境2. 获取XSLT

Python中Flask模板的使用与高级技巧详解

《Python中Flask模板的使用与高级技巧详解》在Web开发中,直接将HTML代码写在Python文件中会导致诸多问题,Flask内置了Jinja2模板引擎,完美解决了这些问题,下面我们就来看看F... 目录一、模板渲染基础1.1 为什么需要模板引擎1.2 第一个模板渲染示例1.3 模板渲染原理二、模板

浅析如何使用xstream实现javaBean与xml互转

《浅析如何使用xstream实现javaBean与xml互转》XStream是一个用于将Java对象与XML之间进行转换的库,它非常简单易用,下面将详细介绍如何使用XStream实现JavaBean与... 目录1. 引入依赖2. 定义 JavaBean3. JavaBean 转 XML4. XML 转 J

使用Python创建一个功能完整的Windows风格计算器程序

《使用Python创建一个功能完整的Windows风格计算器程序》:本文主要介绍如何使用Python和Tkinter创建一个功能完整的Windows风格计算器程序,包括基本运算、高级科学计算(如三... 目录python实现Windows系统计算器程序(含高级功能)1. 使用Tkinter实现基础计算器2.

在.NET平台使用C#为PDF添加各种类型的表单域的方法

《在.NET平台使用C#为PDF添加各种类型的表单域的方法》在日常办公系统开发中,涉及PDF处理相关的开发时,生成可填写的PDF表单是一种常见需求,与静态PDF不同,带有**表单域的文档支持用户直接在... 目录引言使用 PdfTextBoxField 添加文本输入域使用 PdfComboBoxField

Git可视化管理工具(SourceTree)使用操作大全经典

《Git可视化管理工具(SourceTree)使用操作大全经典》本文详细介绍了SourceTree作为Git可视化管理工具的常用操作,包括连接远程仓库、添加SSH密钥、克隆仓库、设置默认项目目录、代码... 目录前言:连接Gitee or github,获取代码:在SourceTree中添加SSH密钥:Cl

Python中模块graphviz使用入门

《Python中模块graphviz使用入门》graphviz是一个用于创建和操作图形的Python库,本文主要介绍了Python中模块graphviz使用入门,具有一定的参考价值,感兴趣的可以了解一... 目录1.安装2. 基本用法2.1 输出图像格式2.2 图像style设置2.3 属性2.4 子图和聚

windows和Linux使用命令行计算文件的MD5值

《windows和Linux使用命令行计算文件的MD5值》在Windows和Linux系统中,您可以使用命令行(终端或命令提示符)来计算文件的MD5值,文章介绍了在Windows和Linux/macO... 目录在Windows上:在linux或MACOS上:总结在Windows上:可以使用certuti

CentOS和Ubuntu系统使用shell脚本创建用户和设置密码

《CentOS和Ubuntu系统使用shell脚本创建用户和设置密码》在Linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设置密码,本文写了一个shell... 在linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设

Python使用Matplotlib绘制3D曲面图详解

《Python使用Matplotlib绘制3D曲面图详解》:本文主要介绍Python使用Matplotlib绘制3D曲面图,在Python中,使用Matplotlib库绘制3D曲面图可以通过mpl... 目录准备工作绘制简单的 3D 曲面图绘制 3D 曲面图添加线框和透明度控制图形视角Matplotlib