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的端到端测试框架SeleniumBase使用解读

《Python的端到端测试框架SeleniumBase使用解读》:本文主要介绍Python的端到端测试框架SeleniumBase使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录SeleniumBase详细介绍及用法指南什么是 SeleniumBase?SeleniumBase

Java继承映射的三种使用方法示例

《Java继承映射的三种使用方法示例》继承在Java中扮演着重要的角色,它允许我们创建一个类(子类),该类继承另一个类(父类)的所有属性和方法,:本文主要介绍Java继承映射的三种使用方法示例,需... 目录前言一、单表继承(Single Table Inheritance)1-1、原理1-2、使用方法1-

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级

SpringBoot中使用Flux实现流式返回的方法小结

《SpringBoot中使用Flux实现流式返回的方法小结》文章介绍流式返回(StreamingResponse)在SpringBoot中通过Flux实现,优势包括提升用户体验、降低内存消耗、支持长连... 目录背景流式返回的核心概念与优势1. 提升用户体验2. 降低内存消耗3. 支持长连接与实时通信在Sp

python使用库爬取m3u8文件的示例

《python使用库爬取m3u8文件的示例》本文主要介绍了python使用库爬取m3u8文件的示例,可以使用requests、m3u8、ffmpeg等库,实现获取、解析、下载视频片段并合并等步骤,具有... 目录一、准备工作二、获取m3u8文件内容三、解析m3u8文件四、下载视频片段五、合并视频片段六、错误

gitlab安装及邮箱配置和常用使用方式

《gitlab安装及邮箱配置和常用使用方式》:本文主要介绍gitlab安装及邮箱配置和常用使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装GitLab2.配置GitLab邮件服务3.GitLab的账号注册邮箱验证及其分组4.gitlab分支和标签的

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

nginx启动命令和默认配置文件的使用

《nginx启动命令和默认配置文件的使用》:本文主要介绍nginx启动命令和默认配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录常见命令nginx.conf配置文件location匹配规则图片服务器总结常见命令# 默认配置文件启动./nginx

在Windows上使用qemu安装ubuntu24.04服务器的详细指南

《在Windows上使用qemu安装ubuntu24.04服务器的详细指南》本文介绍了在Windows上使用QEMU安装Ubuntu24.04的全流程:安装QEMU、准备ISO镜像、创建虚拟磁盘、配置... 目录1. 安装QEMU环境2. 准备Ubuntu 24.04镜像3. 启动QEMU安装Ubuntu4