做一个网站价格,莆田网站建设咨询,个人网站可以做资讯小说类,公司做网站的意义流程分析
Websocket客户端与Websocket服务器端 前端浏览器和后端服务器的连接通信 HTTP与Websocket对比 服务器端编码
1.引入pom依赖
!--webSocket--
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-sta…流程分析
Websocket客户端与Websocket服务器端 前端浏览器和后端服务器的连接通信 HTTP与Websocket对比 服务器端编码
1.引入pom依赖
!--webSocket--
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-websocket/artifactId
/dependency
2. 编写配置类
Configuration
public class WebSocketConfig
{Beanpublic ServerEndpointExporter serverEndpointExporter(){return new ServerEndpointExporter();}
}
3.编写服务代码
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;/*** WebSocket服务器设置*/
ServerEndpoint(value /wsServer/{userId})
Component
public class WebSocketServer
{// concurrent包的线程安全Set用来存放每个客户端对应的MyWebSocket对象。public static ConcurrentHashMapString, WebSocketServer webSocketMap new ConcurrentHashMap();public static ConcurrentHashMapString, WebSocketServer typeMap new ConcurrentHashMap();// 与某个客户端的连接会话需要通过它来给客户端发送数据private Session session;// 接收userIdprivate String userId ;/*** 连接建立成功调用的方法*/OnOpenpublic void onOpen(Session session, PathParam(userId) String userId){this.session session;this.userId userId;if (webSocketMap.containsKey(userId)){webSocketMap.remove(userId);webSocketMap.put(userId, this);} else{webSocketMap.put(userId, this);}try{sendMessage(我是服务端你连接成功了);} catch (IOException e){e.printStackTrace();}}/*** 连接关闭调用的方法*/OnClosepublic void onClose(){if (webSocketMap.containsKey(userId)){webSocketMap.remove(userId);}}/*** 收到客户端消息后调用的方法*/OnMessagepublic void onMessage(String message, Session session){if (StringUtils.isNotBlank(message)){try{// 解析发送的报文JSONObject jsonObject JSON.parseObject(message);String type (String) jsonObject.get(type);if (typeMap.containsKey(type)){typeMap.remove(type);typeMap.put(type, this);} else{typeMap.put(type, this);}} catch (Exception e){e.printStackTrace();}}}/*** 发生错误时调用*/OnErrorpublic void onError(Session session, Throwable error){error.printStackTrace();}/*** 实现服务器主动推送*/public void sendMessage(String message) throws IOException{this.session.getBasicRemote().sendText(message);}/*** 发送自定义消息*/public static void sendInfo(String message, PathParam(userId) String userId) throws IOException{if (StringUtils.isNotBlank(userId) webSocketMap.containsKey(userId)){webSocketMap.get(userId).sendMessage(message);}}}
4.状态变更通知前端
// 通过WebSocket通知前端人员下发状态变更
try
{// 通过map获取对应的sessionWebSocketServer.typeMap.get(userId).sendMessage(封装的消息体);
} catch (IOException e)
{throw new RuntimeException(e);
}