此篇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" })
@ResponseBody
public 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<>();
@OnOpen
public void onOpen(Session session, @PathParam("deviceId") String deviceId) {
//System.err.println("【建立连接】 用户设备号为:" + deviceId);
webSocketData.put(deviceId, session);
logger.info("用户设备号"+deviceId);
}
@OnClose
public 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);
}
}
}
@OnMessage
public 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();
}
}
}
}
}
```\