Project Summary 48: Springboot integrated Websocket Case
Springboot specific integrated Websocket implemented in many ways, but the principle is the same;
First put a specific case
pom.xml jar dependence
<!-- websocket --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency>
The server sends a message
package com.hs.web.thirdparty.webconnect; import com.hs.common.util.json.JsonUtil; import java.util.ArrayList; import java.util.List; public class WebConnectionManager { private static WebConnectionManager instance = new WebConnectionManager(); private List<UpdateListener> changeListenerList; private WebConnectionManager() { changeListenerList = new ArrayList<UpdateListener>(); } public static WebConnectionManager getInstance() { return instance; } public void addChangeListener(UpdateListener changeListener) { synchronized (changeListenerList) { changeListenerList.add(changeListener); } } public void removeChangeListener(UpdateListener changeListener) { synchronized (changeListenerList) { for (UpdateListener listener : changeListenerList) { if (listener.getUid().equals(changeListener.getUid())) { changeListenerList.remove(listener); break; } } } } public void sendMessage(String message) { synchronized (changeListenerList) { for (UpdateListener listener : changeListenerList) { listener.updateHandle(message); } } } public void sendMessage(Object obj) { //System.out.println("JsonUtil.toJson(obj): " +JsonUtil.toJson(obj)); sendMessage(JsonUtil.toJson(obj)); } private String getMessage() { return null; } public static void main(String[] args) { } }
The client requests an inlet
package com.hs.web.thirdparty.webconnect; import org.springframework.stereotype.Component; import javax.websocket.OnClose; import javax.websocket.OnMessage; import javax.websocket.OnOpen; import javax.websocket.Session; import javax.websocket.server.ServerEndpoint; import java.io.IOException; import java.util.logging.Logger; @ServerEndpoint(value = "/monitor") @Component public class WebSocketServer { private Session targetSession; private UpdateListener changeListener; private static final Logger sysLogger = Logger.getLogger("sysLog"); /** *@Description:链接建立成功时调用的方法 *@param *@return void *@author TangYujie *@date 2019/12/12 17:11 */ @OnOpen public void open(Session session) { this.targetSession = session; changeListener = new UpdateListener() { @Override public String getUid() { return targetSession.getId(); } @Override public void updateHandle(String message) { sendMessage(message); } }; WebConnectionManager.getInstance().addChangeListener(changeListener); sysLogger.info("*** WebSocket opened from sessionId " + targetSession.getId()); } /** *@Description:收到客户端消息 *@param *@return void *@author TangYujie *@date 2019/12/12 17:13 */ @OnMessage public void inMessage(String message) { } /** *@Description: 连接关闭 *@param *@return void *@author TangYujie *@date 2019/12/12 17:15 */ @OnClose public void end() { WebConnectionManager.getInstance().removeChangeListener(changeListener); sysLogger.info("*** WebSocket closed from sessionId " + this.targetSession.getId()); } private synchronized void sendMessage(String message){ try { targetSession.getBasicRemote().sendText(message); } catch (IOException e) { sysLogger.warning(e.getMessage()); } catch(IllegalStateException e){ sysLogger.warning(e.getMessage()); } } }
Listener interface class: an interface class defines updateHandle (database processing) and getuid (acquisition Uid) Method two
package com.hs.web.thirdparty.webconnect; public interface UpdateListener { void updateHandle(String message); String getUid(); }
The server sends a message
public static void main(String[] args) { String data = "this is a test message"; WebConnectionManager.getInstance().sendMessage(data); }
Analysis shows:
1- When the client by ws: // ip: port / monitor connection socket, according @ServerEndpoint (value = "/ monitor") annotation; labeled @OnOpen performed WebSocketServer open method, i.e. a connection is established;
2-open UpdateListener method implements an interface class, and this is added to achieve the WebConnectionManager List <UpdateListener> changeListenerList; and the interface class of updateHandle UpdateListener achieved targetSession.getBasicRemote () sendText (message);. A service end of the push message;
3- When the server by WebConnectionManager.getInstance () sendMessage (data) when sending a message, will traverse List <UpdateListener> changeListenerList, wherein the method is performed updateHandle, thereby performing the push message;