欧美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)用程序,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下

一、什么是websocket

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

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

WebSocket協(xié)議可以在不同的平臺(tái)和編程語(yǔ)言中實(shí)現(xiàn),包括Web瀏覽器和服務(wù)器端。在Web瀏覽器中,可以使用JavaScript中的WebSocket API來(lái)實(shí)現(xiàn)WebSocket連接。在服務(wù)器端,可以使用各種編程語(yǔ)言和框架來(lái)實(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)用程序。通過(guò)WebSocket,開(kāi)發(fā)人員可以更加方便地實(shí)現(xiàn)實(shí)時(shí)通信功能,提高用戶(hù)體驗(yàn)。

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

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

1.springBoot父級(jí)依賴(lài)

<!--依賴(lài)的父級(jí)工程-->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.6.6</version>
    <relativePath/>
</parent>

2.springBoot依賴(lài)

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

3.webSocket依賴(lài)

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

三、代碼 

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

服務(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,"孩子們,我回來(lái)了!");
                localSockets.add(webSocket);
            }

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

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

            //連接發(fā)送錯(cuò)誤時(shí)調(diào)用,后觸發(fā)onClose方法
            @Override
            public void onError(WebSocket webSocket, Exception e) {
                logger.info(webSocket.getRemoteSocketAddress() + "客戶(hù)端與服務(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:客戶(hù)端
     * @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("張開(kāi)第三只眼");
        for (WebSocket webSocket : localSockets){
            this.sendMessage(webSocket,message);
        }
        logger.info("孩子們我燃盡了");
    }
}

客戶(hù)端:

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/";
    //所有連接到客戶(hù)端的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,"孩子們,我是客戶(hù)端");
                    localSockets.add(this);
                }

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

                @Override
                public void onClose(int i, String s, boolean b) {
                    logger.info("斷開(kāi)連接");
                    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:客戶(hù)端
     * @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("張開(kāi)第三只眼");
        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)文章

  • mybatis-plus?如何使用雪花算法ID生成策略

    mybatis-plus?如何使用雪花算法ID生成策略

    這篇文章主要介紹了mybatis-plus如何使用雪花算法ID生成策略,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java程序設(shè)計(jì)之12個(gè)經(jīng)典樣例

    Java程序設(shè)計(jì)之12個(gè)經(jīng)典樣例

    這篇文章主要給大家分享關(guān)于Java程序設(shè)計(jì)11個(gè)經(jīng)典樣例,主要以舉例的形式詳細(xì)的講解了Java程序設(shè)計(jì)的各種方法,需要的朋友可以參考一下文章具體的內(nèi)容
    2021-10-10
  • Java線程之間通信的幾種方式詳解

    Java線程之間通信的幾種方式詳解

    在 Java 中,線程之間的通信是通過(guò)共享內(nèi)存模型來(lái)實(shí)現(xiàn)的,線程通過(guò)共享的對(duì)象和變量來(lái)交換數(shù)據(jù),為了確保線程間通信的正確性,Java 提供了一系列機(jī)制來(lái)實(shí)現(xiàn)線程安全、同步和通信,以下是常用的幾種線程間通信的方式,以及它們的使用方法和場(chǎng)景,需要的朋友可以參考下
    2025-03-03
  • SpringBootTest--踩坑錯(cuò)誤的解決

    SpringBootTest--踩坑錯(cuò)誤的解決

    這篇文章主要介紹了SpringBootTest--踩坑錯(cuò)誤的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • SpringBoot集成vue的開(kāi)發(fā)解決方案

    SpringBoot集成vue的開(kāi)發(fā)解決方案

    這篇文章主要介紹了SpringBoot集成vue的開(kāi)發(fā)解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Java web中 war exploded 的解決方案

    Java web中 war exploded 的解決方案

    這篇文章主要介紹了Java web中 war exploded 的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • spring中@Transactional注解和事務(wù)的實(shí)戰(zhàn)

    spring中@Transactional注解和事務(wù)的實(shí)戰(zhàn)

    本文主要介紹了spring中@Transactional注解和事務(wù)的實(shí)戰(zhàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-07-07
  • SpringBoot屬性注入的兩種方法

    SpringBoot屬性注入的兩種方法

    這篇文章主要介紹了SpringBoot屬性注入的兩種方法,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下
    2020-11-11
  • Java實(shí)現(xiàn)兩人五子棋游戲(五) 判斷是否有一方勝出

    Java實(shí)現(xiàn)兩人五子棋游戲(五) 判斷是否有一方勝出

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)兩人五子棋游戲,判斷是否有一方勝出,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Spring Boot定時(shí)器創(chuàng)建及使用解析

    Spring Boot定時(shí)器創(chuàng)建及使用解析

    這篇文章主要介紹了Spring Boot定時(shí)器創(chuàng)建及使用解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07

最新評(píng)論