java 实现 websocket消息推送

业务场景是后台触发某个事件(比如后台执行一条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 socketMap = new ConcurrentHashMap();

    /**
     * 连接建立成功调用的方法
     * @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();
}

 

你可能感兴趣的:(Ĵjava小科技)