国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SpringBoot整合WebSocket詳細教程

這篇具有很好參考價值的文章主要介紹了SpringBoot整合WebSocket詳細教程。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

預期效果

SpringBoot整合WebSocket詳細教程

SpringBoot整合WebSocket詳細教程
共開啟兩個頁面,實現(xiàn)一對一聊天。

服務端代碼:https://gitee.com/lianaozhe/springboot-websocket.git

代碼實現(xiàn)邏輯

服務端

導入相關(guān)依賴:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>

        <!-- hutool 工具包,各種封裝功能 一應俱全-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.5</version>
        </dependency>

WebSocketConfig配置類:

package com.web.config;

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

/**
 * @ClassName WebSocketConfig
 * @Description TODO
 * @Author laz
 * @Date 2023/4/26 16:18
 * @Version 1.0
 */
@Configuration
public class WebSocketConfig {

    /**
     * 	注入ServerEndpointExporter,
     * 	這個bean會自動注冊使用了@ServerEndpoint注解聲明的Websocket endpoint
     */
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
    
}

WebSocket操作類:

package com.web.websocket;

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArraySet;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;

import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * @ClassName WebSocket
 * @Description TODO
 * @Author laz
 * @Date 2023/4/26 16:20
 * @Version 1.0
 */
@Component
@Slf4j
@ServerEndpoint("/websocket/{userId}")
public class WebSocket {

    //與某個客戶端的連接會話,需要通過它來給客戶端發(fā)送數(shù)據(jù)
    private Session session;
    /**
     * 用戶ID
     */
    private String userId;

    /**
     * 用來存放每個客戶端對應的MyWebSocket對象。
     */
    private static CopyOnWriteArraySet<WebSocket> webSockets =new CopyOnWriteArraySet<>();
    // 用來存在線連接用戶信息
    private static ConcurrentHashMap<String,Session> sessionPool = new ConcurrentHashMap<String,Session>();

    /**
     * 鏈接成功調(diào)用的方法
     */
    @OnOpen
    public void onOpen(Session session, @PathParam(value="userId")String userId) {
        try {
            this.session = session;
            this.userId = userId;
            webSockets.add(this);
            sessionPool.put(userId, session);
            log.info("【websocket消息】有新的連接,用戶id是【{}】總數(shù)為【{}】",userId,webSockets.size());
        } catch (Exception e) {
        }
    }

    /**
     * 鏈接關(guān)閉調(diào)用的方法
     */
    @OnClose
    public void onClose() {
        try {
            webSockets.remove(this);
            sessionPool.remove(this.userId);
            log.info("【websocket消息】連接斷開,總數(shù)為:"+webSockets.size());
        } catch (Exception e) {
        }
    }
    /**
     * 收到客戶端消息后調(diào)用的方法
     *
     * @param message
     * @param message
     */
    @OnMessage
    public void onMessage(String message) {
        log.info("【websocket消息】收到客戶端消息:"+message);
        JSONObject jsonObject = JSONUtil.parseObj(message);
        Object toUserId = jsonObject.get("toUserId");
        Session session = sessionPool.get(toUserId);

        session.getAsyncRemote().sendText(JSONUtil.toJsonStr(jsonObject.get("msg")));

    }

    /** 發(fā)送錯誤時的處理
     * @param session
     * @param error
     */
    @OnError
    public void onError(Session session, Throwable error) {

        log.error("用戶錯誤,原因:"+error.getMessage());
        error.printStackTrace();
    }


    // 此為廣播消息
    public void sendAllMessage(String message) {
        log.info("【websocket消息】廣播消息:"+message);
        for(WebSocket webSocket : webSockets) {
            try {
                if(webSocket.session.isOpen()) {
                    webSocket.session.getAsyncRemote().sendText(message);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    // 此為單點消息
    public void sendOneMessage(String userId, String message) {
        Session session = sessionPool.get(userId);

        if (session != null&&session.isOpen()) {
            try {
                log.info("【websocket消息】 單點消息:"+message);
                session.getAsyncRemote().sendText(message);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    // 此為單點消息(多人)
    public void sendMoreMessage(String[] userIds, String message) {
        for(String userId:userIds) {
            Session session = sessionPool.get(userId);
            if (session != null&&session.isOpen()) {
                try {
                    log.info("【websocket消息】 單點消息:"+message);
                    session.getAsyncRemote().sendText(message);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

    }

}

TestController測試接口類:

package com.web.controller;

import com.web.websocket.WebSocket;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @ClassName TestController
 * @Description TODO
 * @Author laz
 * @Date 2023/4/26 16:23
 * @Version 1.0
 */
@RestController
@RequestMapping("web")
public class TestController {

    @Autowired
    private WebSocket webSocket;

    @RequestMapping("test")
    public String test(String userId,String msg){
        webSocket.sendOneMessage(userId,msg);
        return "成功";
    }
}

客戶端

test.html文件:

<!doctype html>
<html lang="zh-CN">
	<head>
		<!-- 必須的 meta 標簽 -->
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

		<!-- Bootstrap 的 CSS 文件 -->
		<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css"
			integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous">



		<title>WebSocket1</title>

		<style>
			form {
				width: 820px;
				margin: auto;
			}

			.div1 {
				width: 820px;
				height: 500px;
				border: #000000;
				border-width: thin;
				border-style: solid;
			}

			.div2 {
				text-align: center;
				width: 800px;
				height: 50px;
			}
		</style>

		<script>
			function clearData() {
				$("#div1").html("");
			}


			var socket;

			function openSocket() {
				if (typeof(WebSocket) == "undefined") {
					console.log("您的瀏覽器不支持WebSocket");
				} else {
					console.log("您的瀏覽器支持WebSocket");

					//websocket地址
					var socketUrl = "ws://localhost:8088/websocket/20";
					console.log(socketUrl);
					if (socket != null) {
						socket.close();
						socket = null;
					}
					socket = new WebSocket(socketUrl);
					//打開事件
					socket.onopen = function() {
						console.log("websocket已打開");
						$("#div1").append("websocket已打開" + "<br \>");
					};
					//獲得消息事件
					socket.onmessage = function(msg) {
						console.log(msg.data);
						$("#div1").append("接收到消息:" + msg.data + "<br \>");

					};
					//關(guān)閉事件
					socket.onclose = function() {
						console.log("websocket已關(guān)閉");
						$("#div1").append("websocket已關(guān)閉" + "<br \>");
					};
					//發(fā)生了錯誤事件
					socket.onerror = function() {
						console.log("websocket發(fā)生了錯誤");
						$("#div1").append("websocket發(fā)生了錯誤" + "<br \>");
					}
				}
			}

			function sendMsg() {
				if (typeof(WebSocket) == "undefined") {
					console.log("您的瀏覽器不支持WebSocket");
				} else {
					console.log("您的瀏覽器支持WebSocket");
					console.log('{"toUserId":"' + $("#toUserId").val() + '","msg":"' + $("#msg").val() + '"}');
					socket.send('{"toUserId":"' + $("#toUserId").val() + '","msg":"' + $("#msg").val() + '"}');

					var msg = document.getElementById("msg").value;
					$("#div1").append("發(fā)送消息:" + msg + "<br \>");
					document.getElementById("msg").value = "";
				}


			}
		</script>

	</head>
	<body>

		<h1 align="center">WebSocket測試Demo</h1><br />
		<form class="form-inline">

			<div class="form-group mx-sm-3 mb-2">
				<label for="toUserId" class="sr-only">toUserId</label>
				<input type="text" class="form-control" id="toUserId" placeholder="toUserId">
			</div>
			<div class="form-group mb-2">
				<label for="msg" class="sr-only">消息內(nèi)容</label>
				<input type="text" class="form-control" id="msg" placeholder="消息內(nèi)容">
			</div>
			<div class="form-group mx-sm-3 mb-2">
				<button type="button" class="btn btn-primary" onclick="openSocket()">開啟socket</button>
			</div>
			<div class="form-group mx-sm-3 mb-2">
				<button type="button" class="btn btn-danger" onclick="sendMsg()">發(fā)送消息</button>
			</div>
			<div class="form-group mx-sm-3 mb-2">
				<button type="button" class="btn btn-secondary" onclick="clearData()">清空內(nèi)容</button>
			</div>
			<div class="div2"></div>
			<div class="div1" id="div1"></div>

		</form>

	</body>

	<script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js"
		integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous">
	</script>
	<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js"
		integrity="sha384-7ymO4nGrkm372HoSbq1OY2DP4pEZnMiA+E0F3zPr+JQQtQ82gQ1HPY3QIVtztVua" crossorigin="anonymous">
	</script>

</html>

SpringBoot整合WebSocket詳細教程
復制test.html文件為test2.html文件,將上面的userId由’20’改為’10’,后面測試使用。

測試

測試一

運行服務端項目,打開test.html,點擊’開啟socket’按鈕(一定要先開啟socket連接,否則無法接收到消息)。

SpringBoot整合WebSocket詳細教程

可以看到,服務端與客戶端已建立了連接。

然后調(diào)用我們的測試接口:

SpringBoot整合WebSocket詳細教程

然后觀察test.html頁面:

SpringBoot整合WebSocket詳細教程
可以看到,客戶端的用戶20成功接收到服務端發(fā)來的信息。

測試二

打開test2.html,同樣點擊’開啟socket’,與服務端建立連接。

此時用test2.html給test.html發(fā)送一條消息。

SpringBoot整合WebSocket詳細教程
SpringBoot整合WebSocket詳細教程

可以看到,此時兩個頁面直接已經(jīng)可以進行一對一的聊天了。

代碼已上傳到git:https://gitee.com/lianaozhe/springboot-websocket.git文章來源地址http://www.zghlxwxcb.cn/news/detail-427703.html

到了這里,關(guān)于SpringBoot整合WebSocket詳細教程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • 《SpringBoot篇》18.SpringBoot整合Memcached緩存超詳細教程

    《SpringBoot篇》18.SpringBoot整合Memcached緩存超詳細教程

    陳老老老板 說明:工作了,學習一些新的技術(shù)棧和工作中遇到的問題,邊學習邊總結(jié),各位一起加油。需要注意的地方都標紅了,還有資源的分享. 一起加油。 本文是介紹Memcached與SpringBoot整合 整合之前先大致了解一下Memcached,是一個? 免費開源的、高性能的、具有分布式內(nèi)

    2024年02月03日
    瀏覽(19)
  • SpringBoot整合SpringSecurity詳細教程(實戰(zhàn)開發(fā)講解)

    SpringBoot整合SpringSecurity詳細教程(實戰(zhàn)開發(fā)講解)

    今天小編使用到了SpringBoot+SpringSecurity進行公司項目開發(fā),之前使用到項目都是采用xml配置來整合SpringSecurity,對于第一次使用SpringBoot整合SpringSecurity也是比較陌生,過程中也是遇到各種各樣的問題,在CSDN的知識海洋中遺留的相關(guān)的整合教程也是五花八門,找一篇完整的教程簡

    2024年02月15日
    瀏覽(17)
  • Elasticsearch安裝、使用,Springboot整合Elasticsearch詳細教程

    Elasticsearch安裝、使用,Springboot整合Elasticsearch詳細教程

    Elasticsearch 是一個分布式、RESTful 風格的搜索和數(shù)據(jù)分析引擎,能夠?qū)崿F(xiàn)近乎實時的搜索。 Elasticsearch官網(wǎng) https://www.elastic.co/cn/ 這篇文章主要簡單介紹一下Elasticsearch,Elasticsearch的java API博主也在學習中,文章會持續(xù)更新~ 目錄 第一步:下載Elasticsearch 下載7.6.2版本 下載其他版本

    2024年02月04日
    瀏覽(57)
  • SpringBoot 整合 clickhouse和mysql 手把手教程全網(wǎng)最詳細

    SpringBoot 整合 clickhouse和mysql 手把手教程全網(wǎng)最詳細

    最近做一個項目 需要 整合mysql clickhouse 多數(shù)據(jù)源 后臺用的是ruoyi框架 需要注意的是官網(wǎng)不建議使用ru.yandex.clickhouse驅(qū)動,應該改成com.clickhouse驅(qū)動,并且推薦使用0.3.2以上的版本 重點在@DataSource(value = DataSourceType.SLAVE) 注解上 在這里切換從庫代表這個類里面的方法都切換成從庫

    2024年02月06日
    瀏覽(20)
  • SpringBoot整合多數(shù)據(jù)源,并支持動態(tài)新增與切換(詳細教程)

    SpringBoot整合多數(shù)據(jù)源,并支持動態(tài)新增與切換(詳細教程)

    推薦文章: ????1、springBoot對接kafka,批量、并發(fā)、異步獲取消息,并動態(tài)、批量插入庫表; ????2、SpringBoot用線程池ThreadPoolTaskExecutor異步處理百萬級數(shù)據(jù); ????3、java后端接口API性能優(yōu)化技巧 ????4、SpringBoot+MyBatis流式查詢,處理大規(guī)模數(shù)據(jù),提高系統(tǒng)的性能和響應能力。 一

    2024年02月10日
    瀏覽(25)
  • docker安裝grafana,prometheus,exporter以及springboot整合詳細教程(GPE)

    docker安裝grafana,prometheus,exporter以及springboot整合詳細教程(GPE)

    springboot項目ip:192.168.168.1 測試服務器ip:192.168.168.81 文章來自互聯(lián)網(wǎng),自己略微整理下,更容易上手,方便自己,方便大家 最終效果: node springboot docker pull prom/node-exporter docker pull prom/mysqld-exporter docker pull google/cadvisor docker pull prom/prometheus docker pull grafana/grafana ? 訪問url: http://192.168

    2024年02月10日
    瀏覽(49)
  • WebSocket--整合springboot

    目錄 握手攔截器 WebSocket處理程序 HttpSessionHandshakelnterceptor (抽象類):? ?握手攔截器,在握手前后添加操作 AbstractWebSocketHandler (抽象類) :? ?WebSocket處理程序,監(jiān)聽連接前,連接中,連接后WebSocketConfigurer (接口):? ? 配置程序,比如配置監(jiān)聽哪個端口,上面的握手攔截器,處理

    2024年01月16日
    瀏覽(31)
  • SpringBoot整合Websocket(Java websocket怎么使用)

    SpringBoot整合Websocket(Java websocket怎么使用)

    WebSocket 是一種基于 TCP 協(xié)議的全雙工通信協(xié)議,可以在瀏覽器和服務器之間建立 實時、雙向的數(shù)據(jù)通信 。可以用于在線聊天、在線游戲、實時數(shù)據(jù)展示等場景。與傳統(tǒng)的 HTTP 協(xié)議不同,WebSocket 可以保持 長連接 ,實時傳輸數(shù)據(jù),避免了頻繁的 HTTP 請求和響應,節(jié)省了網(wǎng)絡帶

    2024年02月10日
    瀏覽(20)
  • 【W(wǎng)ebSocket】SpringBoot整合WebSocket實現(xiàn)聊天室(一)

    【W(wǎng)ebSocket】SpringBoot整合WebSocket實現(xiàn)聊天室(一)

    目錄 一、準備 1、引入依賴 2、創(chuàng)建配置類 二、相關(guān)注解 首先我們需要在項目中引入依賴,有兩種方式。第一種我們可以在創(chuàng)建Spring Boot項目時搜索WebSocket然后勾選依賴 第二種是我們可以直接在項目的pom.xml文件中插入以下依賴 我們需要進行如下配置 ServerEndpointExporter 是一個

    2024年02月13日
    瀏覽(92)
  • WebSocket整合springboot顯示進度條

    WebSocket整合springboot顯示進度條

    SpringBoot整合WebScoket顯示進度條 - 鐘小嘿 - 博客園 對于大文件上傳解析,若直接上傳,會超時,可使用WebSocket長鏈接方式實時顯示文件的上傳狀態(tài),實際上是從文件上傳到內(nèi)容解析完成存入數(shù)據(jù)庫的過程,各個階段的進度可自定義。 本文使用SpringBoot+WebSocket+vue2.0+Element+nginx實

    2024年02月14日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包