本文主要是介绍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使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!