Thomas Zhou
Thomas Zhou
session分为global session和local session。local session是在每次分发请求时从global session衍生出来的副本,仅对当前请求有效。 SessionService只能在前端服务器上获取和调用。踢掉用户推荐使用LocalSessionService上的kick系列方法。推送消息也建议使用ChannelService的push系列方法。这些方法是不区分前后端服务器的。
`app.get('localSessionService')`
都能踢掉用户,`self.app.get('sessionService')`只能在用户所连接的前端服务器上使用,建议用`app.get('localSessionService')`。
这样做的主要目的就是去除维护多处session缓存不一致的复杂度。 一般情况下,handler里获取到的session就足够了。像localSessionService里的get, getByUid方法主要是给一些无法获取到session的情况下获取相关session信息时使用。
id是消息的id,type是消息的类型,type为2表示是服务器返回的response消息,3表示是服务器推送的消息,可以参考[这里](https://github.com/NetEase/pomelo/wiki/Pomelo-%E9%80%9A%E8%AE%AF%E5%8D%8F%E8%AE%AE#message-type-)。 我在本地观察,发送一个聊天消息只会返回一个type为2的response消息,用来确认聊天消息的发送结果。 从你提供的id信息来看,似乎是连续发了两个request,然后收到了两个response,具体是什么request/response,还得将具体包的内容贴上来才能看出来。 `pushByChannel`没有res返回。这里主要是兼容`pushByPlayerName`的接口风格。res表示发送消息的结果,成功为OK,也有可能接收消息的玩家不在线,则返回其他的状态码。
恩,log4js升级后不兼容了,改回"log4js": "0.5.7"或用pomelo 0.3.5就可以了。
node.js和pomelo的版本是多少呢?我本地测试node 0.8.16和pomelo 0.3.5是正常的。
在`libpomelo`中在调用`pc_client_connet`函数后,会起一个子线程来跑uv的事件循环,以免导致主线程的阻塞。 连接成功后,主线程可以做其他的事情,比如:在UI环境下把控制权还给UI线程。 如果主线程后面没什么事情可做,而直接退出的话,则会导致子线程跟着退出,程序结束。这种情况下,可以在主线程中调用`pc_client_join`函数,等待子线程结束。在子线程的事件回调中,如果调用`pc_client_stop`,可以停止uv事件循环,从而使子线程结束退出。此时`pc_client_join`函数便会返回,执行后续的工作,如释放资源等。 `example/`里的[request.c](https://github.com/NetEase/libpomelo/blob/master/example/request.c)和[notify.c](https://github.com/NetEase/libpomelo/blob/master/example/notify.c)都是采用这个流程。[destroy.c](https://github.com/NetEase/libpomelo/blob/master/example/destroy.c)则是主线程休眠一段时间后,调用`pc_client_destroy`函数主动销毁客户端实例的例子。
log4js使用的什么版本的呢?之前有人报过类似的错误是因为log4js升级了,导致不兼容问题。把log4js版本指定为0.5.7就可以了。