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

Java?springBoot初步使用websocket的代碼示例

 更新時間:2025年03月15日 10:22:58   作者:星極天下第一  
這篇文章主要介紹了Java?springBoot初步使用websocket的相關(guān)資料,WebSocket是一種實現(xiàn)實時雙向通信的協(xié)議,適用于需要實時通信的應(yīng)用程序,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

一、什么是websocket

WebSocket是一種在Web應(yīng)用程序中實現(xiàn)實時雙向通信的協(xié)議。它為瀏覽器和服務(wù)器之間提供了一種持久連接,在一個連接上可以雙向傳輸數(shù)據(jù)。相比傳統(tǒng)的HTTP協(xié)議,WebSocket具有更低的延遲和更高的效率。

WebSocket使用了類似于握手的方式來建立連接。在握手過程中,瀏覽器和服務(wù)器會交換一些信息,以建立一個WebSocket連接。一旦連接建立,瀏覽器和服務(wù)器之間就可以實時地傳輸數(shù)據(jù),而不需要每次都發(fā)起新的HTTP請求。

WebSocket協(xié)議可以在不同的平臺和編程語言中實現(xiàn),包括Web瀏覽器和服務(wù)器端。在Web瀏覽器中,可以使用JavaScript中的WebSocket API來實現(xiàn)WebSocket連接。在服務(wù)器端,可以使用各種編程語言和框架來實現(xiàn)WebSocket服務(wù)器。

WebSocket的應(yīng)用場景非常廣泛。它可以用于實時聊天應(yīng)用、實時游戲、實時股票行情、實時協(xié)作編輯等需要實時通信的應(yīng)用程序。通過WebSocket,開發(fā)人員可以更加方便地實現(xiàn)實時通信功能,提高用戶體驗。

這里我們使用Java配合springboot2進行使用。

二、依賴坐標地址

1.springBoot父級依賴

<!--依賴的父級工程-->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.6.6</version>
    <relativePath/>
</parent>

2.springBoot依賴

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

3.webSocket依賴

<dependency>
    <groupId>org.java-websocket</groupId>
    <artifactId>Java-WebSocket</artifactId>
    <version>1.3.8</version>
</dependency>

三、代碼 

不多說了,直接拿去看吧,都在注釋里面了。

服務(wù)器:

package com.blockchain.qgy.network.websocket;

import com.blockchain.qgy.util.Strings;
import org.java_websocket.WebSocket;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.List;

@Component
public class P2pPointServer {
    //日志記錄
    private Logger logger = LoggerFactory.getLogger(P2pPointServer.class);
    //本機的Server的WebSocket端口
    private Integer port = 7001;
    //所有連接到服務(wù)器的WebSocket緩存器
    private List<WebSocket> localSockets = new ArrayList<>();

    public List<WebSocket> getLocalSockets() {
        return localSockets;
    }

    public void setLocalSockets(List<WebSocket> localSockets) {
        this.localSockets = localSockets;
    }

    @PostConstruct
    @Order(1)
    public void initServer(){
        final WebSocketServer socketServer = new WebSocketServer(new InetSocketAddress(port)) {

            //創(chuàng)建鏈接成功時觸發(fā)
            @Override
            public void onOpen(WebSocket webSocket, ClientHandshake clientHandshake) {
                sendMessage(webSocket,"孩子們,我回來了!");
                localSockets.add(webSocket);
            }

            //斷開連接時觸發(fā)
            @Override
            public void onClose(WebSocket webSocket, int i, String s, boolean b) {
                logger.info(webSocket.getRemoteSocketAddress() + "客戶端與服務(wù)器斷開連接");
                localSockets.remove(webSocket);
            }

            //接收到消息時觸發(fā)
            @Override
            public void onMessage(WebSocket webSocket, String s) {
                logger.info("收到了客戶端的消息:" + s);
                sendMessage(webSocket,"孩子們,我收到消息了");
            }

            //連接發(fā)送錯誤時調(diào)用,后觸發(fā)onClose方法
            @Override
            public void onError(WebSocket webSocket, Exception e) {
                logger.info(webSocket.getRemoteSocketAddress() + "客戶端與服務(wù)器連接發(fā)送錯誤");
                localSockets.remove(webSocket);
            }

            @Override
            public void onStart() {
                logger.info("孩子們我要啟動了?。?);
            }
        };
        socketServer.start();
        logger.info("Man!what can I say,我已經(jīng)啟動了");
    }

    /**
     * 一對一發(fā)送
     * @param webSocket:客戶端
     * @param message:信息
     */
    public void sendMessage(WebSocket webSocket,String message){
        logger.info("發(fā)送給"+webSocket.getRemoteSocketAddress().getPort() + "的p2p消息是:" + message);
        webSocket.send(message);
    }

    /**
     * 一對多發(fā)送
     * @param message:信息
     */
    public void broatcast(String message){
        if (localSockets.size() == 0 || Strings.isNullOrEmpty(message)) return;

        logger.info("張開第三只眼");
        for (WebSocket webSocket : localSockets){
            this.sendMessage(webSocket,message);
        }
        logger.info("孩子們我燃盡了");
    }
}

客戶端:

package com.blockchain.qgy.network.websocket;

import com.blockchain.qgy.util.Strings;
import org.java_websocket.WebSocket;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;

@Component
public class P2pPointClient {
    //日志記錄
    private Logger logger = LoggerFactory.getLogger(P2pPointClient.class);
    //服務(wù)器端的地址
    private String wsUrl = "ws://localhost:7001/";
    //所有連接到客戶端的WebSocket緩存器
    private List<WebSocket> localSockets = new ArrayList<>();

    public List<WebSocket> getLocalSockets() {
        return localSockets;
    }

    public void setLocalSockets(List<WebSocket> localSockets) {
        this.localSockets = localSockets;
    }

    @PostConstruct
    @Order(2)
    public void connectServer(){
        try {
            final WebSocketClient socketClient = new WebSocketClient(new URI(wsUrl)) {
                @Override
                public void onOpen(ServerHandshake serverHandshake) {
                    sendMessage(this,"孩子們,我是客戶端");
                    localSockets.add(this);
                }

                @Override
                public void onMessage(String s) {
                    logger.info("收到服務(wù)器發(fā)來的信息:"+s);
                }

                @Override
                public void onClose(int i, String s, boolean b) {
                    logger.info("斷開連接");
                    localSockets.remove(this);
                }

                @Override
                public void onError(Exception e) {
                    logger.info("連接錯誤");
                    localSockets.remove(this);
                }
            };
            socketClient.connect();
        } catch (Exception e) {
            e.printStackTrace();
            logger.info("連接錯誤");
        }
    }

    /**
     * 一對一發(fā)送
     * @param webSocket:客戶端
     * @param message:信息
     */
    public void sendMessage(WebSocket webSocket,String message){
        logger.info("發(fā)送給"+webSocket.getRemoteSocketAddress().getPort() + "的p2p消息是:" + message);
        webSocket.send(message);
    }

    /**
     * 一對多發(fā)送
     * @param message:信息
     */
    public void broatcast(String message){
        if (localSockets.size() == 0 || Strings.isNullOrEmpty(message)) return;

        logger.info("張開第三只眼");
        for (WebSocket webSocket : localSockets){
            this.sendMessage(webSocket,message);
        }
        logger.info("孩子們我燃盡了");
    }
}

總結(jié) 

到此這篇關(guān)于Java springBoot初步使用websocket的文章就介紹到這了,更多相關(guān)springBoot使用websocket內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot整合SpringDataJPA的示例

    SpringBoot整合SpringDataJPA的示例

    本文主要介紹了SpringBoot整合SpringDataJPA的示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • JavaWeb pageContext對象原理解析

    JavaWeb pageContext對象原理解析

    這篇文章主要介紹了JavaWeb pageContext對象原理解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • Redis作為緩存應(yīng)用的情形詳細分析

    Redis作為緩存應(yīng)用的情形詳細分析

    實際開發(fā)中緩存處理是必須的,不可能我們每次客戶端去請求一次服務(wù)器,服務(wù)器每次都要去數(shù)據(jù)庫中進行查找,為什么要使用緩存?說到底是為了提高系統(tǒng)的運行速度
    2023-01-01
  • 通過dom4j解析xml字符串(示例代碼)

    通過dom4j解析xml字符串(示例代碼)

    本篇文章主要是對通過dom4j解析xml字符串的示例代碼進行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2013-12-12
  • IDEA快速生成實體類的示例教程

    IDEA快速生成實體類的示例教程

    這篇文章主要介紹了IDEA快速生成實體類的示例教程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • JavaWeb?Servlet技術(shù)及其應(yīng)用實踐

    JavaWeb?Servlet技術(shù)及其應(yīng)用實踐

    這篇文章主要介紹了JavaWeb?Servlet技術(shù),Servlet指在服務(wù)器端執(zhí)行的一段Java代碼,可以接收用戶的請求和返回給用戶響應(yīng)結(jié)果,感興趣想要詳細了解可以參考下文
    2023-05-05
  • java兩個integer數(shù)據(jù)判斷相等用==還是equals

    java兩個integer數(shù)據(jù)判斷相等用==還是equals

    本文主要介紹了java兩個integer數(shù)據(jù)判斷相等用==還是equals,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Map集合之HashMap的使用及說明

    Map集合之HashMap的使用及說明

    這篇文章主要介紹了Map集合之HashMap的使用及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • springboot之如何同時連接多個redis

    springboot之如何同時連接多個redis

    這篇文章主要介紹了springboot之如何同時連接多個redis問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Java中的ConcurrentLinkedQueue松散隊列解析

    Java中的ConcurrentLinkedQueue松散隊列解析

    這篇文章主要介紹了Java中的ConcurrentLinkedQueue松散隊列解析,鏈表是松散的,鏈表節(jié)點并不都是有效的,允許存在無效節(jié)點val=null,但是只有最后一個節(jié)點才能next=null,需要的朋友可以參考下
    2023-12-12

最新評論

泾川县| 图木舒克市| 漠河县| 西平县| 东乡| 高淳县| 余干县| 西华县| 兴宁市| 洛扎县| 阿坝县| 安福县| 丹东市| 新源县| 宜州市| 枣强县| 浪卡子县| 蓝山县| 兴山县| 孟州市| 双江| 高唐县| 长丰县| 定襄县| 五指山市| 宁乡县| 延安市| 陈巴尔虎旗| 尼玛县| 和林格尔县| 武定县| 阳高县| 化州市| 林甸县| 丹棱县| 额尔古纳市| 马龙县| 定州市| 左贡县| 额敏县| 永吉县|