欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

一、什么是websocket

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

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

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

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

這里我們使用Java配合springboot2進(jìn)行使用。

二、依賴坐標(biāo)地址

1.springBoot父級(jí)依賴

<!--依賴的父級(jí)工程-->
<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);
    //本機(jī)的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)建鏈接成功時(shí)觸發(fā)
            @Override
            public void onOpen(WebSocket webSocket, ClientHandshake clientHandshake) {
                sendMessage(webSocket,"孩子們,我回來了!");
                localSockets.add(webSocket);
            }

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

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

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

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

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

    /**
     * 一對(duì)多發(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("連接錯(cuò)誤");
                    localSockets.remove(this);
                }
            };
            socketClient.connect();
        } catch (Exception e) {
            e.printStackTrace();
            logger.info("連接錯(cuò)誤");
        }
    }

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

    /**
     * 一對(duì)多發(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring SpringMVC在啟動(dòng)完成后執(zhí)行方法源碼解析

    Spring SpringMVC在啟動(dòng)完成后執(zhí)行方法源碼解析

    這篇文章主要介紹了SpringMVC在啟動(dòng)完成后執(zhí)行方法源碼解析,還是非常不錯(cuò)的,在這里分享給大家,需要的朋友可以參考下。
    2017-09-09
  • 微服務(wù)架構(gòu)設(shè)計(jì)RocketMQ進(jìn)階事務(wù)消息原理詳解

    微服務(wù)架構(gòu)設(shè)計(jì)RocketMQ進(jìn)階事務(wù)消息原理詳解

    這篇文章主要介紹了為大家介紹了微服務(wù)架構(gòu)中RocketMQ進(jìn)階層面事務(wù)消息的原理詳解,有需要的朋友可以借鑒參考下希望能夠有所幫助
    2021-10-10
  • java駝峰轉(zhuǎn)換的方法

    java駝峰轉(zhuǎn)換的方法

    這篇文章主要為大家詳細(xì)介紹了java駝峰轉(zhuǎn)換的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Java設(shè)計(jì)模式之java裝飾者模式詳解

    Java設(shè)計(jì)模式之java裝飾者模式詳解

    這篇文章主要為大家詳細(xì)介紹了java設(shè)計(jì)模式之裝飾者模式,裝飾者模式是一種結(jié)構(gòu)式模式,感興趣的朋友可以參考一下,希望能夠給你帶來幫助
    2021-09-09
  • 實(shí)例解析Json反序列化之ObjectMapper(自定義實(shí)現(xiàn)反序列化方法)

    實(shí)例解析Json反序列化之ObjectMapper(自定義實(shí)現(xiàn)反序列化方法)

    這篇文章主要介紹了實(shí)例解析Json反序列化之ObjectMapper,json自定義序列化的方法,需要的朋友可以了解下。
    2017-09-09
  • idea導(dǎo)入maven工程的三種方法

    idea導(dǎo)入maven工程的三種方法

    這篇文章主要介紹了idea導(dǎo)入maven工程的三種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Spring Boot 與DBunit 配合使用方法

    Spring Boot 與DBunit 配合使用方法

    這篇文章主要介紹了Spring Boot 與DBunit 配合使用方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-09-09
  • mybatis一對(duì)一查詢功能

    mybatis一對(duì)一查詢功能

    所謂的一對(duì)一查詢,就是說我們?cè)诓樵円粋€(gè)表的數(shù)據(jù)的時(shí)候,需要關(guān)聯(lián)查詢其他表的數(shù)據(jù)。這篇文章主要介紹了mybatis一對(duì)一查詢功能,需要的朋友可以參考下
    2017-02-02
  • Java中獲取文件大小的詳解及實(shí)例代碼

    Java中獲取文件大小的詳解及實(shí)例代碼

    這篇文章主要介紹了Java中獲取文件大小的詳解及實(shí)例代碼的相關(guān)資料,一種是使用File的length()方法,另外一種是使用FileInputStream的available()方法,這里就說下如何使用需要的朋友可以參考下
    2016-12-12
  • 線程安全的單例模式的幾種實(shí)現(xiàn)方法分享

    線程安全的單例模式的幾種實(shí)現(xiàn)方法分享

    線程安全的單例模式實(shí)現(xiàn)有幾種思路,個(gè)人認(rèn)為第2種方案最優(yōu)雅:、餓漢式、借助內(nèi)部類、普通加鎖解決、雙重檢測(cè),但要注意寫法,如果單體模式繼續(xù)擴(kuò)展為N元單體模式,那就是對(duì)象池模式了
    2014-02-02

最新評(píng)論