JS部分: $(document).ready(function(){ socket(); });
function socket() { let userId = parent.userId(); //判断当前浏览器是否支持WebSocket if ('WebSocket' in window) { websocket = new WebSocket("ws://localhost:8081/webSocketFile/"+"data"+userId); } else { alert('当前浏览器不支持socket,无法推送消息。') } //连接发生错误的回调方法 websocket.onerror = function () { console.log("连接发生错误的回调方法 "); }; //连接成功建立的回调方法 websocket.onopen = function (event) { console.log("连接成功建立的回调方法"); } //接收到消息的回调方法 websocket.onmessage = function (event) { let dataArr = event.data; let bfb=GetPercent(filecount++,dataArr.split("-")[0]); changejd(bfb); $("#filelist").html($("#filelist").html()+dataArr.split("-")[1]+"分析完成!"); if(filecount/10==0){ $("#filelist").html($("#filelist").html()+"</br>"); } } //连接关闭的回调方法 websocket.onclose = function () { console.log("close"); } //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。 window.onbeforeunload = function () { websocket.close(); } } //关闭连接 function closeWebSocket() { websocket.close(); } //发送消息 function send() { websocket.send("我是socked正在连接,请稍后"); }
webSocket 类
import java.io.IOException; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.ConcurrentHashMap; import javax.websocket.*; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import org.springframework.stereotype.Component; @ServerEndpoint(value = "/webSocketFile/{userno}") @Component public class WebSocket { //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。 private static int onlineCount = 0; //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识 private static ConcurrentHashMap<String, WebSocket> webSocketSet = new ConcurrentHashMap<String, WebSocket>(); //与某个客户端的连接会话,需要通过它来给客户端发送数据 private Session session; //当前发消息的人员编号 private static String userno = ""; /** * 连接建立成功调用的方法 * * @param session 可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据 */ @OnOpen public void onOpen(@PathParam(value = "userno") String param, Session session, EndpointConfig config) { userno = param;//接收到发送消息的人员编号 this.session = session; webSocketSet.put(param, this);//加入map中 } /** * 连接关闭调用的方法 */ @OnClose public void onClose() { if (!userno.equals("")) { webSocketSet.remove(userno); //从set中删除 } } /** * 收到客户端消息后调用的方法 * * @param message 客户端发送过来的消息 * @param session 可选的参数 */ @OnMessage public void onMessage(String message, Session session) { System.out.println("来自客户端的消息:" + message); sendAll(message); } /** * 给指定的人发送消息 * @param userId soket地址 * @param data 回传数据 */ public void sendToUser(String userId, String data) { try { if (webSocketSet.get(userId) != null) { webSocketSet.get(userId).sendMessage(data);//1微信用户审核 } else { System.out.println("当前用户不在线"); } } catch (IOException e) { e.printStackTrace(); } } /** * 给所有人发消息 * @param message */ public void sendAll(String message) { String now = getNowTime(); String sendMessage = message.split("[|]")[0]; //遍历HashMap for (String key : webSocketSet.keySet()) { try { //判断接收用户是否是当前发消息的用户 if (!userno.equals(key)) { webSocketSet.get(key).sendMessage(message); System.out.println("key = " + key); } } catch (IOException e) { e.printStackTrace(); } } } /** * 获取当前时间 * * @return */ private static String getNowTime() { Date date = new Date(); DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String time = format.format(date); return time; } /** * 发生错误时调用 * * @param session * @param error */ @OnError public void onError(Session session, Throwable error) { System.out.println("发生错误"); error.printStackTrace(); } /** * 这个方法与上面几个方法不一样。没有用注解,是根据自己需要添加的方法。 * * @throws IOException */ public void sendMessage(String context) throws IOException { synchronized(this.session) { this.session.getBasicRemote().sendText(context); } } }
业务调用
@Autowired private WebSocket webSocket;
//获取运行文件百分比 public void getPercentage(String fileName,int index){ //获取正在解析的文件名称 webSocket.sendToUser("data"+ ShiroUtils.getUserId(), index+"-"+fileName); }