业务场景是后台触发某个事件(比如后台执行一条insert语句前台就要刷新界面),每一个用户都对应着一个界面,所以这里用wxId作为一个用户页面的唯一标识
js代码
var websocket=new WebSocket("ws://localhost/voucher/"+wxId);
//接收到消息的回调方法
websocket.onmessage = function (event) {
if(event.data == "yes"){
window.location.reload();
}
}
//监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
window.onbeforeunload = function () {
websocket.close();
}
java websocket ,用来接受和发送消息
package com.hy.wx.websocket;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import org.apache.log4j.Logger;
@ServerEndpoint("/voucher/{wsKey}")
public class VoucherSocket {
private static final Logger log = Logger
.getLogger(OrderWebSocket.class);
//Key作为用户标识
private static ConcurrentHashMap<String,Session> socketMap = new ConcurrentHashMap<String,Session>();
/**
* 连接建立成功调用的方法
* @param session 可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据
*/
@OnOpen
public void onOpen(@PathParam("wsKey")String wsKey,Session session){
socketMap.put(wsKey,session);
log.info("websocket连接成功.连接key:"+wsKey);
}
/**
* 连接关闭调用的方法
*/
@OnClose
public void onClose(@PathParam("wsKey")String wsKey){
socketMap.remove(wsKey);
log.info("websocket退出链接.连接key:"+wsKey);
}
/**
* 发生错误时调用
* @param session
* @param error
*/
@OnError
public void onError(Session session, Throwable error){
log.error("websocket链接异常");
error.printStackTrace();
}
/**
* 推送消息
* @param message
* @throws IOException
*/
public static void sendMessage(String message,String wsKey) throws IOException{
if(socketMap.get(wsKey)!=null) {
socketMap.get(wsKey).getBasicRemote().sendText(message);
}
}
}
java 后台service推送消息
try {
//页面推送消息
VoucherSocket.sendMessage("yes",wxId);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}