maven引入jar包或者使用tomcat8以上中的websocket-api.jarjavascript
<dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>7.0</version> <scope>provided</scope> </dependency>
WebSocket.java前端
package com.web.common; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.websocket.*; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import java.io.IOException; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** * WebSocket链接 sessionKey是url中的参数 */ @ServerEndpoint("/websocket/{sessionKey}") public class WebSocket { private static final Logger log = LoggerFactory.getLogger(WebSocket.class); //静态变量,用来记录当前在线链接数。应该把它设计成线程安全的。 private static int onlineCount = 0; //concurrent包的线程安全,用来存放每一个客户端对应的MyWebSocket对象。若要实现服务端与单一客户端通讯的话,能够使用Map来存放,其中Key能够为用户标识 private static Map<String, WebSocket> webSockets = new ConcurrentHashMap<>(); //与某个客户端的链接会话,须要经过它来给客户端发送数据 private Session session; /** * 链接创建成功调用的方法 * @param session 可选的参数。session为与某个客户端的链接会话,须要经过它来给客户端发送数据 * @param sessionKey url地址参数 */ @OnOpen public void onOpen(Session session, @PathParam("sessionKey") String sessionKey){ if (!webSockets.containsKey(sessionKey)){ this.session = session; webSockets.put(sessionKey, this); addOnlineCount(); log.info("当前websocket链接数:" + onlineCount); } } /** * 链接关闭调用的方法 * @param sessionKey url地址参数 */ @OnClose public void onClose(@PathParam("sessionKey") String sessionKey){ if (webSockets.containsKey(sessionKey)){ webSockets.remove(sessionKey); subOnlineCount(); log.info("当前websocket链接数:" + onlineCount); } } /** * 收到客户端消息后调用的方法 * @param message 客户端发送过来的消息 * @param session 可选的参数 */ @OnMessage public void onMessage(String message, Session session) { log.info("来自客户端的消息:" + message); } /** * 发生错误时调用 * @param session 可选的参数 * @param error 错误消息 */ @OnError public void onError(Session session, Throwable error){ log.error("websocket发生错误:" + error); } /** * 该方法没有用注解,是根据本身须要添加的方法。在本身的业务中调用,发送消息给前端。 * @param sessionKey * @param message 返回的结果 * @throws IOException */ public static void sendMessage(String sessionKey,String message) throws IOException { WebSocket webSocket = webSockets.get(sessionKey); if (null != webSocket){ log.info("websocket发送消息:" + message); //同步发送 发送第二条时,必须等第一条发送完成 webSocket.session.getBasicRemote().sendText(message); //异步发送 //webSocket.session.getAsyncRemote().sendText(message); } } public static synchronized int getOnlineCount() { return onlineCount; } public static synchronized void addOnlineCount() { onlineCount++; } public static synchronized void subOnlineCount() { onlineCount--; } }
前端jsjava
var webSocket = null; $(function () { //判断当前浏览器是否支持WebSocket if ('WebSocket' in window) { webSocket = new _WebSocket("${WEBSOCKET_URL}/websocket/${(receipt.id)!''}"); } else { alert('当前浏览器不支持webSocket'); } //链接成功创建的回调方法 websocket.onopen = function() { console.info("WebSocket链接成功"); }; //链接出错 webSocket.onerror = function (ev) { console.info('链接错误', ev); }; //接收到消息的回调方法 webSocket.onmessage = function (ev) { console.info(ev); }; //链接关闭的回调方法 webSocket.onclose = function () { console.info('WebSocket链接关闭'); }; }); //关闭WebSocket链接 function closeWebSocket() { webSocket.close(); }