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

SpringBoot+Websocket實現一個簡單的網頁聊天功能代碼

 更新時間:2017年08月24日 10:13:44   作者:Ldlood  
本篇文章主要介紹了SpringBoot+Websocket實現一個簡單的網頁聊天功能代碼,具有一定的參考價值,有需要的可以了解一下

最近做了一個SpringBoot的項目,被SpringBoot那簡介的配置所迷住。剛好項目中,用到了websocket。于是,我就想著,做一個SpringBoot+websocket簡單的網頁聊天Demo。

效果展示:

當然,項目很簡單,沒什么代碼,一眼就能明白

導入websocket的包。

通過使用SpringBoot導入包的時候,我們可以發(fā)現,很多包都是以 spring-boot-starter 開頭的,對于我這種強迫癥 ,簡直是福音

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

配置websocket

服務端

首先新建一個WebSocketConfig的類,添加 @Component 注解 注入一個bean

@Component
public class WebSocketConfig {

  @Bean
  public ServerEndpointExporter serverEndpointExporter() {

    return new ServerEndpointExporter();
  }
}

新建一個service,本來覺得是新建一個控制器,但是我覺得這也不是控制器,但是也不太是service。最后還是選擇新建一個servece。這里你如果有更好的想法可以按照你的來。

這個service里面有4個方法,這些方法很簡單,通過名稱就可以看出是什么意思。

@Component
@ServerEndpoint("/webSocket")
@Slf4j
public class WebSocket {

  private Session session;

  private static CopyOnWriteArraySet<WebSocket> webSockets = new CopyOnWriteArraySet<>();

  private MessageVO messageVO = new MessageVO();

  @OnOpen
  public void onOpen(Session session) {
    this.session = session;
    webSockets.add(this);


    messageVO.setType(1);
    messageVO.setUserNum(webSockets.size());
    messageVO.setMessage("有新的連接");

    ObjectMapper mapper = new ObjectMapper();

    String Json = "";
    try {
      Json = mapper.writeValueAsString(messageVO);
    } catch (Exception ex) {
      log.error(ex.getMessage());
    }

    this.sendMessage(Json);
    log.info("【websocket消息】有新的連接, 總數:{}", webSockets.size());
  }


  @OnClose
  public void onClose() {
    webSockets.remove(this);

    messageVO.setType(2);
    messageVO.setUserNum(webSockets.size());
    messageVO.setMessage("有用戶離開");

    ObjectMapper mapper = new ObjectMapper();

    String Json = "";
    try {
      Json = mapper.writeValueAsString(messageVO);
    } catch (Exception ex) {
      log.error(ex.getMessage());
    }

    this.sendMessage(Json);


    log.info("【websocket消息】連接斷開, 總數:{}", webSockets.size());
  }

  @OnMessage
  public void onMessage(String message) {

    messageVO.setType(3);
    messageVO.setUserNum(webSockets.size());
    messageVO.setMessage(message);

    ObjectMapper mapper = new ObjectMapper();

    String Json = "";
    try {
      Json = mapper.writeValueAsString(messageVO);
    } catch (Exception ex) {
      log.error(ex.getMessage());
    }

    this.sendMessage(Json);

    log.info("【websocket消息】收到客戶端發(fā)來的消息:{}", message);
  }

  public void sendMessage(String message) {
    for (WebSocket webSocket : webSockets) {
      log.info("【websocket消息】廣播消息, message={}", message);
      try {
        webSocket.session.getBasicRemote().sendText(message);
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }
}

客戶端

客戶端也就是我們的html,我用的是原生html5的websocket ,不需要其他的js。直接在html中寫js就可以

<script type="application/javascript">
  var websocket = null;
  var cahtNum = $('.chat-num').text();
  if ('WebSocket' in window) {
    websocket = new WebSocket('ws://localhost:8080/chat/webSocket');

  } else {
    alert('該瀏覽器不支持websocket');
  }

  websocket.onopen = function (event) {
    console.log('websocket建立連接');
  }

  websocket.onclose = function (event) {
    console.log('websocket關閉連接');
  }

  websocket.onmessage = function (event) {
    console.log('websocket收到消息' + event.data);
    var result = $.parseJSON(event.data);
    if (result.type == 3) {
      var element = document.getElementById('message-template').innerHTML;
      $('.message-container').append(element);
      $(".message-content:last").html(result.message);
    }
    else {
      $('.chat-num').text(result.userNum);
    }

  }

  websocket.onerror = function (event) {
    console.log('websocket通信發(fā)生錯誤');

  }

  window.onbeforeunload = function (event) {
    websocket.close();
  }

  $('.send-message').click(function () {
    var message = $('.chat-message').val();
    if (message == "") {
      mdui.alert('請輸入要發(fā)送的消息');
      return;
    }
    sendmessage(message);
    $('.chat-message').val("");
  })

  function sendmessage(message) {
    websocket.send(message);
  }
</script>

這個就是全都的功能,非常簡單,沒什么特別的功能和代碼。

最后附上Github的源代碼傳送門

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Java網絡編程UDP實現多線程在線聊天

    Java網絡編程UDP實現多線程在線聊天

    這篇文章主要為大家詳細介紹了Java網絡編程UDP實現多線程在線聊天,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Java中的序列化機制詳細解讀

    Java中的序列化機制詳細解讀

    這篇文章主要介紹了Java中的序列化機制詳細解讀,序列化:將對象的狀態(tài)信息轉換為可以存儲或傳輸的數據形式(比如二進制)的過程,反序列化:與序列化相對,把序列化轉換成的可以存儲或傳輸的數據形式轉化為對象的狀態(tài)信息的過程,需要的朋友可以參考下
    2023-11-11
  • Springboot如何解決前端請求跨域的問題

    Springboot如何解決前端請求跨域的問題

    這篇文章主要介紹了Springboot如何解決前端請求跨域的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 原生Java操作mysql數據庫過程解析

    原生Java操作mysql數據庫過程解析

    這篇文章主要介紹了原生Java操作mysql數據庫過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • SpringBoot集成xxl-job實現超牛的定時任務的步驟詳解

    SpringBoot集成xxl-job實現超牛的定時任務的步驟詳解

    XXL-JOB是一個分布式任務調度平臺,其核心設計目標是開發(fā)迅速、學習簡單、輕量級、易擴展,現已開放源代碼并接入多家公司線上產品線,開箱即用,本文給大家介紹了SpringBoot集成xxl-job實現超牛的定時任務,需要的朋友可以參考下
    2023-10-10
  • Java 從網上下載文件的幾種方式實例代碼詳解

    Java 從網上下載文件的幾種方式實例代碼詳解

    本文通過實例代碼給大家介紹了java從網上下載文件的幾種方式,非常不錯,具有參考借鑒價值,需要的的朋友參考下吧
    2017-08-08
  • Spring Cloud Gateway 緩存區(qū)異常問題及解決方案

    Spring Cloud Gateway 緩存區(qū)異常問題及解決方案

    最近在測試環(huán)境spring cloud gateway突然出現了異常,接下來通過本文給大家介紹Spring Cloud Gateway 緩存區(qū)異常問題解決方案,需要的朋友可以參考下
    2024-06-06
  • java String 轉成Double二維數組的方法

    java String 轉成Double二維數組的方法

    下面小編就為大家?guī)硪黄猨ava String 轉成Double二維數組的方法。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • 基于Java類的加載方式

    基于Java類的加載方式

    這篇文章主要介紹了基于Java類的加載方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • MyBatisPlus自定義SQL的實現

    MyBatisPlus自定義SQL的實現

    MyBatisPlus提供了自定義SQL功能,允許開發(fā)者在Mapper接口中定義方法,并通過XML文件或注解編寫SQL語句,本文詳解了如何在MP中使用自定義SQL,感興趣的可以了解一下
    2024-09-09

最新評論

建水县| 阿拉善右旗| 达孜县| 浦北县| 乌拉特后旗| 衡东县| 喀喇沁旗| 嘉义县| 工布江达县| 慈利县| 玉溪市| 高要市| 依安县| 鹤山市| 扬州市| 兴化市| 弥渡县| 孝义市| 莆田市| 蒙自县| 浮梁县| 庆阳市| 农安县| 吉木乃县| 寻乌县| 柏乡县| 盖州市| 青海省| 罗源县| 湟源县| 巴楚县| 九江县| 长顺县| 扶余县| 新乡县| 江阴市| 沙河市| 福安市| 清水河县| 曲松县| 绍兴市|