websocket连接
此篇websocket是最简单的运用,虽然简单,但也是需要注意
还有其它方法货协议,比如socket.js等。今天时间不充裕虽然例子都写好了,下次更新websocket所有相关的东西。提前想了解的,可私信
前端
var websocket = null;var timeConnect = 0;//连接function webSocketConnect() {//判断当前浏览器是否支持WebSocket,if ('WebSocket' in window) {websocket = new WebSocket("ws://"+document.location.host+"/${pageContext.request.contextPath}/websocket/test");} else {console.error("不支持WebSocket");}//连接发生错误的回调方法websocket.onerror = function (e) {console.error("WebSocket连接发生错误");reConnect();};//连接成功建立的回调方法websocket.onopen = function (event) {console.log("连接成功!");}//接收到消息的回调方法websocket.onmessage = function (event) {var c=eval("(" + event.data + ")");test("1","浙A01545");}//连接关闭的回调方法websocket.onclose = function (event) {console.log("Socket连接断开");reConnect();}}//重连function reConnect() {// lockReconnect加锁,防止onclose、onerror两次重连timeConnect++;console.log("第" + timeConnect + "次重连");// 进行重连setTimeout(function () {webSocketConnect();}, 2000);}window.onbeforeunload = function() { disWebConnect();}//断开连接function disWebConnect() {if (websocket !== null) {websocket.close();}} //心跳 * 回应setInterval(function () {websocket.send('');}, 1000 * 100)
后端
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Date;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
@RequestMapping({ "/test/" })
@ServerEndpoint("/websocket/test")//
public class WebSocketDataRelay {static Logger logger = LogManager.getLogger(WebSocketDataRelay.class);public static String receiveData = null;
// HttpSession session=null;@RequestMapping({ "vehicleInfo" })@ResponseBodypublic void vehicleInfo(HttpServletRequest request, HttpServletResponse response) throws Exception {response.setHeader("Access-Control-Allow-Origin", "*");response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS");response.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, Accept,X-Requested-With");
// session.setAttribute("receiveData", null);
// session.getAttribute("receiveData");try {JSONArray parameterDate = getParameterDate(request);logger.info("【传值通道打通】"+parameterDate); if (parameterDate != null) {Date date = new Date();int len=parameterDate.size()-1;Object object = parameterDate.get(len);Long cc=Long.valueOf(object.toString());long reverse = Long.reverse(cc) - date.getDay()*37712138;if(reverse < date.getTime() && reverse+1000*60*2 > date.getTime()) {receiveData = parameterDate.toString();//System.err.println("【传值连接】 值为:" + parameterDate.toString());sendMessage(parameterDate.toString());logger.info("【传值连接】 值为:"+parameterDate.toString()); }}else {logger.info("【传值为空】"); }} catch (IOException e) {e.printStackTrace();logger.info("【传值连接错误】"+e); }}public static JSONArray getParameterDate(HttpServletRequest request) throws IOException {StringBuffer buffer = new StringBuffer();BufferedReader reader = null;JSONArray jsonObject = new JSONArray();try {reader = new BufferedReader(new InputStreamReader(request.getInputStream()));String line = null;while ((line = reader.readLine()) != null) {buffer.append(line);}jsonObject = JSON.parseArray(buffer.toString());} catch (IOException e) {e.printStackTrace();throw new IOException("数据读取异常");} finally {if (reader != null) {reader.close();}}return jsonObject;}public static ConcurrentHashMap<String, Session> webSocketData = new ConcurrentHashMap<>();@OnOpenpublic void onOpen(Session session, @PathParam("deviceId") String deviceId) {//System.err.println("【建立连接】 用户设备号为:" + deviceId);webSocketData.put(deviceId, session);logger.info("用户设备号"+deviceId); }@OnClosepublic void onClose(Session session) {String deviceId = null;for (Entry<String, Session> entry : webSocketData.entrySet()) {if (session == entry.getValue()) {deviceId = (String) entry.getKey();webSocketData.remove(deviceId);//System.err.println("【连接断开】 用户设备号为:" + deviceId);logger.info("【连接断开】 用户设备号为:"+deviceId); }}}@OnMessagepublic void onMessage(String message) {sendMessage(receiveData);}public void sendMessage(String message) {if ((message != null) && (message != " ")) {for (Session session1 : webSocketData.values()) {try {session1.getBasicRemote().sendText(message);logger.info("【信息下发】:发送成功"); } catch (Exception e) {e.getMessage();}}}}
}```\