Project Summary 48: Springboot integrated Websocket Case

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;

Guess you like

Origin www.cnblogs.com/wobuchifanqie/p/12033128.html
Recommended