@Toby-wei
2016-09-13T06:13:25.000000Z
字数 3181
阅读 2170
websocket
前端连接
(function(){
var token = '' + new Date().getTime() + '_' + Math.floor(Math.random() * 1000);
$('#qr').attr('src', '/ih/bpv2/get-login-qrcode?token=' + token);
tokenLast = token;
var sockServerUrl = '/ws/socketio/';
if(isPrd){
sockServerUrl = 'http://ws.innohub.io/ws/socketio/';
}
sock = new SockJS(sockServerUrl);
sock.onopen = function(){
console.log('open');
send({action: 'wx-auth-login-mapping-token-4-bpv2', token: tokenLast});
};
sock.onmessage = function(e){
console.log(e.data);
if(!e.data)
return;
var obj = JSON.parse(e.data);
if(obj && 'reject' == obj.action){
console.log('登陆失败');
return;
}
if(obj && 'loginok' == obj.action){
$.get('/ih/bpv2/front/login/done?token=' + tokenLast, function(data){
var errs = {
'token-invalid': '令牌时效'
};
if(data.error){
alert(errs[data.error]);
return;
}
document.location.href = '/bp_20/detail-list.html';
/* if(data.isAdmin){
document.location.href = '/bp/manage.html';
}else{
}*/
});
return;
}
};
})();
window.onbeforeunload = function(){
if(sock)
sock.close();
};
});
发送消息
// 发送文本消息
handler.post('/ih/comm/message/send') { req, resp ->
String openid = req.getCookie('user-login-openid')
if (!openid) {
resp.json([needRelogin: true])
return
}
// 活跃度统计
int active = StatActiveService.ACTIVE_HIGH
StatActiveService.updateActive(openid, active)
req.jsonHandler { json ->
String toOpenid = json.toOpenid
String content = json.content
if (!toOpenid || !content) {
log.info('send message blank')
resp.json([error: 'content-blank'])
return
}
// 判断是否关注
boolean isFocus = WxUserLocal.isFocus(toOpenid)
if (!isFocus) {
resp.json([error: 'user-not-focused'])
return
}
boolean isSendWsOk = MessageService.sendWs(config, handlerSockjs, openid, toOpenid, ipThis,
MessageService.TYPE_TEXT, content)
log.info('send message ws - ' + isSendWsOk)
MessageService.add(openid, toOpenid, MessageService.TYPE_TEXT, content, isSendWsOk)
// 看下对方用户是否在线,不在线就发送模板消息~
if (!isSendWsOk) {
// boolean isVisitOnline = MessageService.isMemberVisitOnline(config, toOpenid)
boolean isPrd = 'true' == config.isPrd
MessageService.sendTplMsg(openid, toOpenid, content, isPrd)
}
resp.json([flag: true])
}
}
发送方法
// 推送websocket消息
static boolean sendWs(Properties config, ChainHandlerSockjs handlerSockjs, String openid, String toOpenid, String ipThis,
String type, String content) {
Map wsInfo = isMemberWsOnline(config, openid, toOpenid)
if (!wsInfo) {
return false
}
String targetIp = wsInfo.targetIp
String targetSockId = wsInfo.targetSockId
// 目标用户的websocket链接是本机
if (targetIp == ipThis) {
Map fromUser = WxUserLocal.getUserByOpenid(openid)
if (!fromUser) {
// 不会发生
log.info('user-not-subscribe')
return false
} else {
boolean isOk = handlerSockjs.send(targetSockId, [type : type, content: content,
fromOpenid: openid,
nickname : fromUser.nickname, headimgurl: fromUser.headimgurl])
log.info('send ws - ' + isOk)
return isOk
}
} else {
// 用http
// for test TODO
int port = 80
String url = 'http://' + targetIp + ':' + port + '/ih/comm/message/send-message'
log.info('redirect - ' + url)
Map params = [:]
params.targetSockId = targetSockId
params.openid = openid
params.type = type
params.content = content
String body = JSON.toJSONString(params)
try {
def req = HttpRequest.post(url).connectTimeout(1000 * 2).send(body)
String str = req.body()
log.info('redirect result ' + str)
if (!str) {
log.info('redirect by http return blank ' + toOpenid + ' - ' + targetSockId)
return false
} else {
def resultSend = JSON.parse(str)
return resultSend && resultSend.flag
}
} catch (e) {
log.error('send message error - ' + toOpenid + ' - ' + targetSockId, e)
return false
}
}
}