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

Springboot + Websocket的集成實現(xiàn)簡單的聊天室功能

這篇具有很好參考價值的文章主要介紹了Springboot + Websocket的集成實現(xiàn)簡單的聊天室功能。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、websocket的介紹

WebSocket是一種網(wǎng)絡(luò)通信協(xié)議,它可以在單個TCP連接上實現(xiàn)雙向(全雙工)通信。WebSocket使用HTML5標準,并且可以在客戶端和服務(wù)器之間建立持久連接,這意味著連接在瀏覽器刷新或關(guān)閉后仍然保持打開狀態(tài)。

WebSocket的主要優(yōu)點包括:

1. 雙向通信:WebSocket支持客戶端和服務(wù)器之間的雙向通信,這使得實時數(shù)據(jù)傳輸變得非常容易。
2. 持久連接:WebSocket使用單個TCP連接,這使得服務(wù)器可以保持與客戶端的通信,即使瀏覽器被關(guān)閉或刷新。
3. 零延遲:由于WebSocket使用單個TCP連接,因此數(shù)據(jù)傳輸不會出現(xiàn)延遲。
4. 更好的性能:WebSocket使用二進制傳輸,這使得數(shù)據(jù)傳輸速度更快。
5. 更好的可伸縮性:WebSocket可以處理大量的并發(fā)連接,因為它使用單個TCP連接。

二、springboot集成websocket(用注解的方式)

1.創(chuàng)建一個springboot項目,測試是否成功
package com.dong.websocket.controller;

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

@RestController
public class HelloController {

    @GetMapping(value = "/")
    public String index() {
        return "Hello World!";
    }
}
2.目錄

java springboot 聊天室,后端,spring boot,websocket,后端

3.依賴
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.2.1.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.dong</groupId>
	<artifactId>springboot_websocket</artifactId>
	<version>1.0.0-SNAPSHOT</version>
	<name>SpringBootProject</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>8</java.version>
	</properties>
	<dependencies>

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

		<!-- lombok -->
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.18.8</version>
		</dependency>

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

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>
4.配置類
package com.dong.websocket.websocket;

import javax.websocket.server.ServerEndpoint;

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

@Configuration
public class WebSocketConfig {

    @Bean
    public ServerEndpointExporter ServerEndpointExporter () {
        return new ServerEndpointExporter();
    }

}
5.監(jiān)聽類
package com.dong.websocket.websocket;

import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import lombok.extern.slf4j.Slf4j;

/**
* 監(jiān)聽websocket地址/myWs
*/
@ServerEndpoint("/myWs")
@Component
@Slf4j
public class WsServeEndPont {

    // 線程安全的Map,用來保存session, static用來確保是屬于類的而不是對象的
    static Map<String, Session> sessionMap = new ConcurrentHashMap<>(); 

    // 連接建立時執(zhí)行的操作
    @OnOpen
    public void OnOpen (Session session) {
        sessionMap.put(session.getId(), session);
        log.info("websocket is open");
    }

    // 收到客戶端消息執(zhí)行的操作
    @OnMessage
    public String onMessage(String text) {
        log.info("收到了一條消息:" + text);
        return "已收到你的消息";
    }

    // 連接關(guān)閉時執(zhí)行的操作
    @OnClose
      public void OnClose (Session session) {
        sessionMap.remove(session.getId());
        log.info("websocket is close");
    }

    // 定時任務(wù):間隔時間2s 
    @Scheduled(fixedRate = 2000)
    public void sendMsg () {
        sessionMap.keySet().forEach(item->{
            try {
				sessionMap.get(item).getBasicRemote().sendText("心跳");
			} catch (IOException e) {
				e.printStackTrace();
			}
        });
    }
}
6.前端頁面ws-client
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>ws client</title>
</head>

<body>

</body>

<script>
    let ws = new WebSocket("ws://localhost:8080/myWs")
    ws.onopen= function () {
        ws.send("hello")
    }
    ws.onmessage = function (message) {
        console.log(message.data)
    }
</script>
</html>

三、springboot集成websocket(用spring框架實現(xiàn))

1.Spring提供的類和接口
  • HttpSessionHandshakeInterceptor(抽象類):握手攔截器,在握手錢后添加操作
  • AbstractWebSocketHandler(抽象類):WebSocket處理程序,監(jiān)聽連接前,連接中,連接后
  • WebSocketConfigurer(接口):配置程序,比如配置監(jiān)聽哪個端口,自定義的握手攔截器,處理程序的使用
2.項目結(jié)構(gòu)

java springboot 聊天室,后端,spring boot,websocket,后端

?3.SessionBean類,封裝websocketsession和用戶id標識
package com.dong.websocket.spring;

import org.springframework.web.socket.WebSocketSession;

import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class SessionBean {

    private WebSocketSession webSocketSession;

    private Integer clientId;

}
4.MyWsInterceptor類,握手攔截器
package com.dong.websocket.spring;

import java.util.Map;

import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;

import lombok.extern.slf4j.Slf4j;

/**
* 握手攔截器
*/
@Component
@Slf4j
public class MyWsInterceptor extends HttpSessionHandshakeInterceptor{

    @Override
    public boolean beforeHandshake (ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes ) throws Exception {
        log.info(request.getRemoteAddress().toString() + "開始握手");
        return super.beforeHandshake(request, response, wsHandler, attributes);
    }

    @Override
    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception ex) {
        log.info(request.getRemoteAddress().toString() + "完成握手");
        super.afterHandshake(request, response, wsHandler, ex);
    }
}
5.MyWsHander類
package com.dong.websocket.spring;

import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;

import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.AbstractWebSocketHandler;

import lombok.extern.slf4j.Slf4j;

/**
 * web socket 主處理程序
 */
@Slf4j
@Component
public class MyWsHandler extends AbstractWebSocketHandler {

    private static Map<String,SessionBean> sessionBeanMap ;

    private static AtomicInteger clientIdMaker;

    private static StringBuffer stringBuffer;

    static {
        sessionBeanMap = new ConcurrentHashMap<>();
        clientIdMaker = new AtomicInteger(0);
        stringBuffer = new StringBuffer();
    }

    //連接建立
    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        super.afterConnectionEstablished(session);
        SessionBean sessionBean = new SessionBean(session,clientIdMaker.getAndIncrement());
        sessionBeanMap.put(session.getId(),sessionBean);
        log.info(sessionBeanMap.get(session.getId()).getClientId()+"建立了連接");
        stringBuffer.append(sessionBeanMap.get(session.getId()).getClientId()+"進入了群聊<br/>");
        sendMessage(sessionBeanMap);
    }
    //收到消息
    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        super.handleTextMessage(session, message);
        log.info(sessionBeanMap.get(session.getId()).getClientId()+":"+message.getPayload());
        stringBuffer.append(sessionBeanMap.get(session.getId()).getClientId()+":"+message.getPayload()+"<br/>");
        sendMessage(sessionBeanMap);
    }
    //傳輸異常
    @Override
    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
        super.handleTransportError(session, exception);
        if(session.isOpen()){
            session.close();
        }
        sessionBeanMap.remove(session.getId());
    }
    //連接關(guān)閉
    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        super.afterConnectionClosed(session, status);
        int clientId = sessionBeanMap.get(session.getId()).getClientId();
        sessionBeanMap.remove(session.getId());
        log.info(clientId+"關(guān)閉了連接");
        stringBuffer.append(clientId+"退出了群聊<br/>");
        sendMessage(sessionBeanMap);
    }

    //    //每2s發(fā)送給客戶端心跳消息
//    @Scheduled(fixedRate = 2000)
//    public void sendMsg() throws IOException {
//        for(String key:sessionBeanMap.keySet()){
//            sessionBeanMap.get(key).getWebSocketSession().sendMessage(new TextMessage("心跳"));
//        }
//    }
    public void sendMessage(Map<String,SessionBean> sessionBeanMap){
        for(String key:sessionBeanMap.keySet()){
            try {
                sessionBeanMap.get(key).getWebSocketSession().sendMessage(new TextMessage(stringBuffer.toString()));
            } catch (IOException e) {
//                e.printStackTrace();
                log.error(e.getMessage());
            }
        }
    }
}

6.MyWsConfig類

package com.dong.websocket.spring;

import javax.annotation.Resource;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;

@Configuration
@EnableWebSocket
public class MyWsConfig implements WebSocketConfigurer {

    @Resource
    MyWsHandler myWsHandler;

    @Resource
    MyWsInterceptor myWsInterceptor;

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(myWsHandler, "/myWs1").addInterceptors(myWsInterceptor).setAllowedOrigins("*");
    }

}

四、實現(xiàn)一個簡單的聊天室功能

1.ws-client.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>ws client</title>
</head>
<body>
<p style="border:1px solid black;width: 600px;height: 500px" id="talkMsg"></p>
<input id="message" /><button id="sendBtn" onclick="sendMsg()">發(fā)送</button>
</body>
<script>
    let ws = new WebSocket("ws://localhost:8080/myWs1")
    // ws.onopen=function () {
    // }
    ws.onmessage=function (message) {
        document.getElementById("talkMsg").innerHTML = message.data
    }
    function sendMsg() {
        ws.send(document.getElementById("message").value)
        document.getElementById("message").value=""
    }
</script>
</html>

2.MyWsHandler

package com.dong.websocket.spring;

import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;

import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.AbstractWebSocketHandler;

import lombok.extern.slf4j.Slf4j;

/**
 * web socket 主處理程序
 */
@Slf4j
@Component
public class MyWsHandler extends AbstractWebSocketHandler {

    private static Map<String,SessionBean> sessionBeanMap ;

    private static AtomicInteger clientIdMaker;

    private static StringBuffer stringBuffer;

    static {
        sessionBeanMap = new ConcurrentHashMap<>();
        clientIdMaker = new AtomicInteger(0);
        stringBuffer = new StringBuffer();
    }

    //連接建立
    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        super.afterConnectionEstablished(session);
        SessionBean sessionBean = new SessionBean(session,clientIdMaker.getAndIncrement());
        sessionBeanMap.put(session.getId(),sessionBean);
        log.info(sessionBeanMap.get(session.getId()).getClientId()+"建立了連接");
        stringBuffer.append(sessionBeanMap.get(session.getId()).getClientId()+"進入了群聊<br/>");
        sendMessage(sessionBeanMap);
    }
    //收到消息
    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        super.handleTextMessage(session, message);
        log.info(sessionBeanMap.get(session.getId()).getClientId()+":"+message.getPayload());
        stringBuffer.append(sessionBeanMap.get(session.getId()).getClientId()+":"+message.getPayload()+"<br/>");
        sendMessage(sessionBeanMap);
    }
    //傳輸異常
    @Override
    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
        super.handleTransportError(session, exception);
        if(session.isOpen()){
            session.close();
        }
        sessionBeanMap.remove(session.getId());
    }
    //連接關(guān)閉
    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        super.afterConnectionClosed(session, status);
        int clientId = sessionBeanMap.get(session.getId()).getClientId();
        sessionBeanMap.remove(session);
        log.info(clientId+"關(guān)閉了連接");
        stringBuffer.append(clientId+"退出了群聊<br/>");
        sendMessage(sessionBeanMap);
    }

    //    //每2s發(fā)送給客戶端心跳消息
//    @Scheduled(fixedRate = 2000)
//    public void sendMsg() throws IOException {
//        for(String key:sessionBeanMap.keySet()){
//            sessionBeanMap.get(key).getWebSocketSession().sendMessage(new TextMessage("心跳"));
//        }
//    }
    public void sendMessage(Map<String,SessionBean> sessionBeanMap){
        for(String key:sessionBeanMap.keySet()){
            try {
                sessionBeanMap.get(key).getWebSocketSession().sendMessage(new TextMessage(stringBuffer.toString()));
            } catch (IOException e) {
//                e.printStackTrace();
                log.error(e.getMessage());
            }
        }
    }
}

效果:

第一個頁面打開:

java springboot 聊天室,后端,spring boot,websocket,后端

?第二個頁面打開并聊天

java springboot 聊天室,后端,spring boot,websocket,后端

demo鏈接:springboot-demo集合: demo集合 - Gitee.com文章來源地址http://www.zghlxwxcb.cn/news/detail-842196.html

到了這里,關(guān)于Springboot + Websocket的集成實現(xiàn)簡單的聊天室功能的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • SpringBoot與webSocket實現(xiàn)在線聊天室——實現(xiàn)私聊+群聊+聊天記錄保存

    SpringBoot與webSocket實現(xiàn)在線聊天室——實現(xiàn)私聊+群聊+聊天記錄保存

    引用參考:原文章地址:https://blog.csdn.net/qq_41463655/article/details/92410518 在此基礎(chǔ)上實現(xiàn)對聊天記錄的保存。 代碼地址:鏈接:https://pan.baidu.com/s/1IJFZDa4S_DF08773sKJWeA 提取碼:jkui 思路:新建一個實體類用于保存聊天記錄,在消息發(fā)送時,設(shè)置對象的各個值然后保存到數(shù)據(jù)庫中。

    2024年02月02日
    瀏覽(88)
  • 基于 SpringBoot+WebSocket 無DB實現(xiàn)在線聊天室(附源碼)

    基于 SpringBoot+WebSocket 無DB實現(xiàn)在線聊天室(附源碼)

    0.1 樣例展示 0.2 源碼地址 GitHub:https://github.com/ShiJieCloud/web-chat Gitee:https://gitee.com/suitbaby/web-chat GitCode:I’m Jie / web-chat · GitCode 1.1 HTTP 常用的 HTTP 協(xié)議是一種無狀態(tài)的、無連接的、單向的應(yīng)用層協(xié)議。它采用了請求/響應(yīng)模型。通信請求只能由客戶端發(fā)起,服務(wù)端對請求做出

    2024年02月05日
    瀏覽(17)
  • Vue + Element-Plus + SpringBoot + WebSocket實現(xiàn)簡易網(wǎng)絡(luò)聊天室

    Vue + Element-Plus + SpringBoot + WebSocket實現(xiàn)簡易網(wǎng)絡(luò)聊天室

    項目流程圖 1. 前端搭建: ? ? ? ? 前端用Vue+Element-Plus 來搭建,由登錄頁面和聊天頁面組成 1.1 登錄頁面 ? ? ? ? 由一個昵稱輸入框組成,用戶輸入自己的昵稱若昵稱和別的用戶不重復,則可進入聊天室,否則提示錯誤并請重新輸入。 ????????這段代碼是一個Vue.js組件的

    2024年02月03日
    瀏覽(22)
  • 在線聊天室(Vue+Springboot+WebSocket)

    在線聊天室(Vue+Springboot+WebSocket)

    實現(xiàn)了一個簡單的在線聊天室的前后端。前端用Vue實現(xiàn),后端用Springboot實現(xiàn)。 ????????在線聊天室的功能包括創(chuàng)建用戶和顯示在線用戶列表、發(fā)送消息和顯示消息列表、用戶和消息列表實時更新這幾點。以下是整體功能的活動圖: 用戶身份 ? ? ? ? 進入聊天室的用戶需

    2024年01月15日
    瀏覽(28)
  • 基于SpringBoot+Vue+WebSocket的在線聊天室

    基于SpringBoot+Vue+WebSocket的在線聊天室

    WebSocket 是一種在 Web 應(yīng)用程序中實現(xiàn)雙向通信的協(xié)議。它提供了一種持久連接,允許客戶端和服務(wù)器之間進行實時數(shù)據(jù)傳輸,而無需進行頻繁的請求和響應(yīng)。 相對于傳統(tǒng)的 HTTP 請求-響應(yīng)模式,WebSocket 在客戶端和服務(wù)器之間建立起一條長久的雙向通信通道。這意味著服務(wù)器可

    2024年01月16日
    瀏覽(41)
  • Django實現(xiàn)websocket聊天室

    WebSocket協(xié)議是基于TCP的一種新的網(wǎng)絡(luò)協(xié)議。它實現(xiàn)了瀏覽器與服務(wù)器雙向通信,即允許服務(wù)器主動發(fā)送信息給客戶端。因此,在WebSocket中,瀏覽器和服務(wù)器只需要完成一次握手,兩者之間就直接可以創(chuàng)建持久性的連接,并進行雙向數(shù)據(jù)傳輸,客戶端和服務(wù)器之間的數(shù)據(jù)交換變

    2023年04月23日
    瀏覽(92)
  • django websocket實現(xiàn)聊天室功能

    django websocket實現(xiàn)聊天室功能

    注意事項channel版本 django2.x 需要匹配安裝 channels 2 django3.x 需要匹配安裝 channels 3 Django 3.2.4 channels 3.0.3 Django 3.2.* channels 3.0.2 Django4.2 channles==3.0.5 是因為最新版channels默認不帶daphne服務(wù)器 直接用命令 python manage.py runsever 默認運行的是wsgi ,修改,刪除settings中的wsgi,都不能正確運

    2024年01月22日
    瀏覽(27)
  • Java+Vue實現(xiàn)聊天室(WebSocket進階-聊天記錄)

    Java+Vue實現(xiàn)聊天室(WebSocket進階-聊天記錄)

    WebSocket 是一種在單個TCP連接上進行全雙工通信的協(xié)議。WebSocket通信協(xié)議于2011年被IETF定為標準RFC 6455,并由RFC7936補充規(guī)范。WebSocket API也被W3C定為標準。 WebSocket使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡單,允許服務(wù)端主動向客戶端推送數(shù)據(jù)。在WebSocket API中,瀏覽器和服

    2024年02月11日
    瀏覽(110)
  • websocket+elementui+vue實現(xiàn)簡易聊天室

    websocket+elementui+vue實現(xiàn)簡易聊天室

    搭建服務(wù)端環(huán)境 安裝socket.io 服務(wù)端基于node,js的express框架生成,所以寫成模塊,引入至app.js中 其中,io.sockets.emit用于向所有建立連接的客戶端發(fā)送信息,socket.broadcast.emit用于向除發(fā)送方之外的客戶端發(fā)送信息。 客戶端基于vue和elementui 進入聊天頁面后,先判斷用戶是否登錄,

    2024年04月25日
    瀏覽(37)
  • websocket實現(xiàn)聊天室(vue2 + node)

    websocket實現(xiàn)聊天室(vue2 + node)

    需求分析如圖: 搭建的項目結(jié)構(gòu)如圖: 前端步驟: vue create socket_demo (創(chuàng)建項目) views下面建立Home , Login組件 路由里面配置路徑 Home組件內(nèi)部開啟websocket連接 前端相關(guān)組件代碼: Login組件 Home組件 router/index.js 后端步驟: 在項目外層創(chuàng)建server文件夾(src目錄同級) npm init -y創(chuàng)建

    2024年01月22日
    瀏覽(101)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包