真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

SpringBoot中添加Websocket支持的方法

背景

SpringBoot是由Pivotal團(tuán)隊(duì)在2013年開始研發(fā)、2014年4月發(fā)布第一個(gè)版本的全新開源的輕量級框架。它基于Spring4.0設(shè)計(jì),不僅繼承了Spring框架原有的優(yōu)秀特性,而且還通過簡化配置來進(jìn)一步簡化了Spring應(yīng)用的整個(gè)搭建和開發(fā)過程。另外SpringBoot通過集成大量的框架使得依賴包的版本沖突,以及引用的不穩(wěn)定性等問題得到了很好的解決。

創(chuàng)新互聯(lián)公司長期為上1000+客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為蟠龍企業(yè)提供專業(yè)的網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站,蟠龍網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

WebSocket協(xié)議是基于TCP的一種新的網(wǎng)絡(luò)協(xié)議。它實(shí)現(xiàn)了瀏覽器與服務(wù)器全雙工(full-duplex)通信——允許服務(wù)器主動發(fā)送信息給客戶端。

WebSocket通信協(xié)議于2011年被IETF定為標(biāo)準(zhǔn)RFC 6455,并被RFC7936所補(bǔ)充規(guī)范。

項(xiàng)目基本配置參考SpringBoot入門一,使用myEclipse新建一個(gè)SpringBoot項(xiàng)目,使用myEclipse新建一個(gè)SpringBoot項(xiàng)目即可。此示例springboot的版本已經(jīng)升級到2.2.1.RELEASE,具體步驟如下:

1. pom.xml添加以下配置信息



        org.springframework.boot
        spring-boot-starter-websocket

完整pom.xml




    
    4.0.0
    com.qfx
    qfxSpringbootWebsocketServerDemo
    1.0
    war
    qfxSpringbootWebsocketServerDemo
    Springboot和Websock整合的示例

    
    
        org.springframework.boot
        spring-boot-starter-parent
        2.2.1.RELEASE
         
    

    
    
        UTF-8
        UTF-8
        1.8
        
        -Dfile.encoding=UTF-8
    

    
        
        
        
            org.springframework.boot
            spring-boot-starter-web
            
                
                    org.springframework.boot
                    spring-boot-starter-logging
                
            
        

        
        
            org.springframework.boot
            spring-boot-starter-log4j2
        

        
        
            org.springframework.boot
            spring-boot-starter-tomcat
            provided
        

        
        
            org.springframework.boot
            spring-boot-starter-websocket
        
    

    
        
        qfxSpringbootWebsocketServerDemo
        
            
                
                    org.springframework.boot
                    spring-boot-maven-plugin
                    
                        
                        
                            org.springframework
                            springloaded
                            1.2.8.RELEASE
                        
                    
                
            
        
    

2. 添加Websocket配置類

如果使用外部Tomcat部署的話,則不需要此配置,否則啟動會報(bào)異常

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

/**
 * 
描述:如果使用外部Tomcat部署的話,則不需要此配置
*   */ @Configuration public class WebSocketConfig {    @Bean    public ServerEndpointExporter serverEndpointExporter() {        return new ServerEndpointExporter();    } }

3. 添加Websocket服務(wù)類

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;

/**
 * 
描述:WebSocket服務(wù)端
*  WebSocket是類似客戶端服務(wù)端的形式(采用ws協(xié)議), *  所以 WebSocketServer其實(shí)就相當(dāng)于一個(gè)ws協(xié)議的 Controller, *  可以在里面實(shí)現(xiàn) @OnOpen、@onClose、@onMessage等方法 */ @ServerEndpoint("/websocket/{cid}") @Component public class WebSocketSer {    private static final Logger LOG = LoggerFactory.getLogger(WebSocketSer.class);    // 靜態(tài)變量,用來記錄當(dāng)前在線連接數(shù)。應(yīng)該把它設(shè)計(jì)成線程安全的。    private static int onlineCount = 0;    // concurrent包的線程安全Set,用來存放每個(gè)客戶端對應(yīng)的MyWebSocket對象。    private static CopyOnWriteArraySet webSocketSet = new CopyOnWriteArraySet();    //與某個(gè)客戶端的連接會話,需要通過它來給客戶端發(fā)送數(shù)據(jù)    private Session session;    // 接收cid    private String cid = "";    /**     * 連接建立成功調(diào)用的方法     */    @OnOpen    public void onOpen(Session session, @PathParam("cid") String cid) {        this.session = session;        webSocketSet.add(this);     // 加入set中        addOnlineCount();           // 在線數(shù)加1        LOG.info("客戶端: " + cid + " 連接成功, 當(dāng)前在線人數(shù)為:" + getOnlineCount());        this.cid = cid;        try {            sendMessage("連接成功");        } catch (IOException e) {            LOG.error("發(fā)送消息異常:", e);        }    }    /**     * 連接關(guān)閉調(diào)用的方法     */    @OnClose    public void onClose() {        webSocketSet.remove(this);  // 從set中刪除        subOnlineCount();           // 在線數(shù)減1        LOG.info("有一個(gè)連接關(guān)閉,當(dāng)前在線人數(shù)為:" + getOnlineCount());    }    /**     * 收到客戶端消息后調(diào)用的方法     *     * @param message 客戶端發(fā)送過來的消息     */    @OnMessage    public void onMessage(String message, Session session) {        LOG.info("收到來自客戶端 " + cid + " 的信息: " + message);        // 群發(fā)消息        for (WebSocketSer item : webSocketSet) {            try {                item.sendMessage(message);            } catch (IOException e) {                e.printStackTrace();            }        }    }    /**     * @param session     * @param error     */    @OnError    public void onError(Session session, Throwable error) {        LOG.error("發(fā)生錯(cuò)誤");        error.printStackTrace();    }    /**     * 實(shí)現(xiàn)服務(wù)器主動推送     */    public void sendMessage(String message) throws IOException {        this.session.getBasicRemote().sendText(message);    }    /**     * 群發(fā)自定義消息     */    public static void sendInfo(String message, @PathParam("cid") String cid) {        LOG.info("推送消息到客戶端:" + cid + ",內(nèi)容: " + message);        for (WebSocketSer item : webSocketSet) {            try {                // 這里可以設(shè)定只推送給這個(gè)cid的,為null則全部推送                if (cid == null) {                    item.sendMessage(message);                } else if (item.cid.equals(cid)) {                    item.sendMessage(message);                }            } catch (IOException e) {                continue;            }        }    }    public static synchronized int getOnlineCount() {        return onlineCount;    }    public static synchronized void addOnlineCount() {        WebSocketSer.onlineCount++;    }    public static synchronized void subOnlineCount() {        WebSocketSer.onlineCount--;    } }

4. 添加Websocket測試webSocket.html和webSocket2.html頁面

webSocket.html 與 webSocket2.html 中的cid 分別是cid_0001 和 cid_0002,只要指定為不一樣的即可




    
    My WebSocket test page



    Welcome
               

5. 編寫一個(gè)發(fā)送消息的Controller

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.qfx.demo.common.service.WebSocketSer;

/**
 * 
描述:測試發(fā)送消息
*   */ @RestController @RequestMapping("message") public class SendCtl {    /**     *
功能:發(fā)送信息給正在連接websocket的所有用戶
    *     * @param msg 消息內(nèi)容     * @return     */    @RequestMapping("sendAllInfo")    public String sendAllInfo(String msg) {        WebSocketSer.sendInfo(msg, null);        return "success";    }    /**     *
功能:發(fā)送信息給正在連接websocket的指定所有用戶
    *     * @param msg 消息內(nèi)容     * @param cid 用戶id     * @return     */    @RequestMapping("sendInfo")    public String sendInfo(String msg, String cid) {        WebSocketSer.sendInfo(msg, cid);        return "success";    } }

6. 完整目錄結(jié)構(gòu)

SpringBoot中添加Websocket支持的方法

7. 測試連接

7.1 Html頁面連接websocket服務(wù)端,分別打開webSocket.html和webSocket2.html頁面,webSocket.html發(fā)送一條信息
http://127.0.0.1/qfxSpringbootWebsocketServerDemo/webSocket.html
http://127.0.0.1/qfxSpringbootWebsocketServerDemo/webSocket2.html

webSocket.html發(fā)送信息,兩個(gè)頁面都能夠接收到,因?yàn)閃ebSocketSer.java的onMessage方法里面會進(jìn)行群發(fā)

webSocket.html(cid_0001)發(fā)送信息

SpringBoot中添加Websocket支持的方法

webSocket2.html(cid_0002)不做操作,也接收到了cid_0001發(fā)送的信息

SpringBoot中添加Websocket支持的方法

后臺輸出

SpringBoot中添加Websocket支持的方法

7.2 通過Controller給所有在線用戶發(fā)送一條信息

SpringBoot中添加Websocket支持的方法

后臺輸出

SpringBoot中添加Websocket支持的方法

兩個(gè)Html頁面都接收到信息

SpringBoot中添加Websocket支持的方法
SpringBoot中添加Websocket支持的方法

7.3 通過Controller給指定在線用戶發(fā)送一條信息

發(fā)送指定信息給cid_0002

SpringBoot中添加Websocket支持的方法

后臺輸出

SpringBoot中添加Websocket支持的方法

webSocket2.html(cid_0002)接收到信息

SpringBoot中添加Websocket支持的方法

webSocket.html(cid_0001)沒有接收到信息,因?yàn)椴皇前l(fā)給他的

SpringBoot中添加Websocket支持的方法


新聞標(biāo)題:SpringBoot中添加Websocket支持的方法
文章鏈接:http://weahome.cn/article/pgideh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部