@Toby-wei
2016-09-13T06:13:25.000000Z
字数 3181
阅读 2220
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_HIGHStatActiveService.updateActive(openid, active)req.jsonHandler { json ->String toOpenid = json.toOpenidString content = json.contentif (!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.isPrdMessageService.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.targetIpString 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 TODOint port = 80String url = 'http://' + targetIp + ':' + port + '/ih/comm/message/send-message'log.info('redirect - ' + url)Map params = [:]params.targetSockId = targetSockIdparams.openid = openidparams.type = typeparams.content = contentString 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}}}