最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot實(shí)現(xiàn)WebSocket全雙工通信的項(xiàng)目實(shí)踐

 更新時(shí)間:2023年05月29日 15:11:19   作者:失去斗志的菜鳥  
本文主要介紹了SpringBoot實(shí)現(xiàn)WebSocket全雙工通信的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、后端pom.xml引入依賴

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

二、啟動(dòng)類注入Bean

@SpringBootApplication
public class TtSdemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(TtSdemoApplication.class, args);
    }
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}

三、編寫WebSocket類

package com.zj.ttsdemo.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
/**
 * Created by
 *
 * @Author: JoyceZhang
 * @Date: 2023/05/25/15:28
 * @Description:
 */
@Slf4j
@ServerEndpoint(value="/websocket")
@Component
public class Websocket {
    private static Session[] sessionContainer = new Session[2];
    /**
     * A,B與服務(wù)器建立連接
     */
    @OnOpen
    public void onOpen(Session session) {
        if (sessionContainer[0] == null && sessionContainer[1] == null) {
            sessionContainer[0] = session;
            log.info("a連接成功");
        } else if (sessionContainer[0] != null && sessionContainer[1] == null) {
            sessionContainer[1] = session;
            log.info("b連接成功");
        } else {
            log.info("連接失敗");
        }
    }
    /**
     * 鏈接關(guān)閉
     */
    @OnClose
    public void onClose(Session session) {
        for(int i=0;i<sessionContainer.length;i++){
            if(sessionContainer[i] == session){
                sessionContainer[i] = null;
                log.info((i==0?"a":"b")+"斷開連接");
            }
        }
    }
    /**
     * 得到另一個(gè)session對(duì)象
     */
    private Session getOtherSession(Session session) {
       for(int i = 0; i<sessionContainer.length;i++){
           if(session == sessionContainer[i]){
               log.info("獲取到另一個(gè)session");
               return sessionContainer[(i==0?1:0)];
           }
       }
         return null;
    }
    /**
     * 向另一個(gè)session發(fā)送消息
     */
    @OnMessage
    public void sendMessage(String message,Session session) throws IOException{
        Session otherSession = this.getOtherSession(session);
        log.info("發(fā)送消息"+message+"到"+(otherSession==sessionContainer[0]?"a":"b"));
        otherSession.getBasicRemote().sendText(message);
    }
    /**
     * 異常處理
     */
    @OnError
    public void onError(Session session, Throwable error) {
        log.error("發(fā)生錯(cuò)誤");
        error.printStackTrace();
    }
}

四、編寫測試頁面

在resource/static目錄下編寫chat.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<input id = "text" type ="text">
<button onclick = "send()">Send</button>
<button onclick = "closeWebSocket()">Close</button>
<div id = "message"></div>
</body>
<script type="text/javascript">
    var websocket = null;
    //判斷當(dāng)前瀏覽器是否支持WebSocket
    if('WebSocket' in window){
        websocket = new WebSocket("ws://localhost:8083/websocket");
    }
    else{
        alert('Not support websocket')
    }
    //連接發(fā)生錯(cuò)誤的回調(diào)方法
    websocket.onerror = function(){
        setMessageInnerHTML("服務(wù)器通信故障");
    };
    //連接成功建立的回調(diào)方法
    websocket.onopen = function(event){
        setMessageInnerHTML("與服務(wù)器通信成功");
    }
    //接收到消息的回調(diào)方法
    websocket.onmessage = function(event){
        setMessageInnerHTML(event.data);
    }
    //連接關(guān)閉的回調(diào)方法
    websocket.onclose = function(){
        setMessageInnerHTML("WebSocket連接關(guān)閉");
    }
    //監(jiān)聽窗口關(guān)閉事件,當(dāng)窗口關(guān)閉時(shí),主動(dòng)去關(guān)閉websocket連接,防止連接還沒斷開就關(guān)閉窗口,server端會(huì)拋異常。
    window.onbeforeunload = function(){
        websocket.close();
    }
    //將消息顯示在網(wǎng)頁上
    function setMessageInnerHTML(innerHTML){
        document.getElementById('message').innerHTML += innerHTML + '<br/>';
    }
    //關(guān)閉連接
    function closeWebSocket(){
        websocket.close();
    }
    //發(fā)送消息
    function send(){
        var message = document.getElementById('text').value;
        websocket.send(message);
    }
</script>
</html>

五、通信測試

 【IT老齊238】十分鐘上手WebSocket全雙工通信協(xié)議_嗶哩嗶哩_bilibili

到此這篇關(guān)于SpringBoot實(shí)現(xiàn)WebSocket全雙工通信的項(xiàng)目實(shí)踐的文章就介紹到這了,更多相關(guān)SpringBoot WebSocket全雙工通信內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何使用Spring Cloud Feign日志查看請(qǐng)求響應(yīng)

    如何使用Spring Cloud Feign日志查看請(qǐng)求響應(yīng)

    這篇文章主要介紹了如何使用Spring Cloud Feign日志查看請(qǐng)求響應(yīng),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • SpringBoot項(xiàng)目的五種創(chuàng)建方式

    SpringBoot項(xiàng)目的五種創(chuàng)建方式

    這篇文章主要介紹了SpringBoot項(xiàng)目的五種創(chuàng)建方式,文中通過圖文結(jié)合的方式講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-12-12
  • 快速掌握SpringBoot應(yīng)用的啟動(dòng)入口

    快速掌握SpringBoot應(yīng)用的啟動(dòng)入口

    本篇并不是深究內(nèi)置服務(wù)器的啟動(dòng)過程,而是追溯Springboot啟動(dòng)之前到底做了什么?它是如何與我們經(jīng)常寫的@SpringBootApplication注解注釋的main方法類綁定起來的?對(duì)SpringBoot啟動(dòng)入口相關(guān)知識(shí)感興趣的朋友一起看看吧
    2022-05-05
  • java泛型中占位符T和?有什么區(qū)別

    java泛型中占位符T和?有什么區(qū)別

    泛型中占位符T和?有什么區(qū)別?有的人可能弄不清楚,本文主要介紹了java泛型中占位符T和?有什么區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下
    2022-05-05
  • springboot中使用redis由淺入深解析

    springboot中使用redis由淺入深解析

    這篇文章主要由淺入深為大家介紹了springboot中使用redis的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • 使用dom4j實(shí)現(xiàn)xml轉(zhuǎn)map與xml轉(zhuǎn)json字符串

    使用dom4j實(shí)現(xiàn)xml轉(zhuǎn)map與xml轉(zhuǎn)json字符串

    這篇文章主要為大家詳細(xì)介紹了如何使用dom4j實(shí)現(xiàn)xml轉(zhuǎn)map與xml轉(zhuǎn)json字符串功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2024-11-11
  • Java實(shí)現(xiàn)分頁代碼

    Java實(shí)現(xiàn)分頁代碼

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)分頁代碼,提高查詢效率,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • Eclipse中maven異常Updating Maven Project的統(tǒng)一解決方案

    Eclipse中maven異常Updating Maven Project的統(tǒng)一解決方案

    今天小編就為大家分享一篇關(guān)于Eclipse中maven異常Updating Maven Project的統(tǒng)一解決方案,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Springboot2 配置AOP日志的方法步驟

    Springboot2 配置AOP日志的方法步驟

    這篇文章主要介紹了Springboot2 配置AOP日志的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Java?@Scheduled定時(shí)任務(wù)不執(zhí)行解決辦法

    Java?@Scheduled定時(shí)任務(wù)不執(zhí)行解決辦法

    這篇文章主要給大家介紹了關(guān)于Java?@Scheduled定時(shí)任務(wù)不執(zhí)行解決的相關(guān)資料,當(dāng)@Scheduled定時(shí)任務(wù)不執(zhí)行時(shí)可以根據(jù)以下步驟進(jìn)行排查和解決,需要的朋友可以參考下
    2023-10-10

最新評(píng)論

台州市| 临高县| 平乡县| 平果县| 柳林县| 宁国市| 开原市| 拜城县| 金乡县| 全椒县| 霸州市| 浦北县| 洛阳市| 高要市| 富裕县| 阳西县| 固阳县| 德安县| 石泉县| 陆川县| 泗阳县| 遂昌县| 通江县| 凤庆县| 三台县| 西青区| 合江县| 潮州市| 房产| 延庆县| 稷山县| 阳曲县| 鄂伦春自治旗| 灌南县| 汪清县| 油尖旺区| 太康县| 霍邱县| 琼结县| 鄱阳县| 定州市|