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<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();
}

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java实现WebSocket实现消息推送的步骤如下: 1.创建WebSocket配置类 ```java @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(new MyWebSocketHandler(), "/websocket").addInterceptors(new MyHandshakeInterceptor()); } } ``` 2.创建WebSocket处理器 ```java public class MyWebSocketHandler extends TextWebSocketHandler { private static final List<WebSocketSession> sessions = new CopyOnWriteArrayList<>(); @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { sessions.add(session); } @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { for (WebSocketSession s : sessions) { s.sendMessage(message); } } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { sessions.remove(session); } } ``` 3.创建握手拦截器 ```java public class MyHandshakeInterceptor implements HandshakeInterceptor { @Override public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception { return true; } @Override public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) { } } ``` 4.在页面中使用JavaScript连接WebSocket ```javascript var socket = new WebSocket("ws://localhost:8080/websocket"); socket.onmessage = function(event) { console.log(event.data); }; ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值