Java中初步使用websocket(springBoot版本)

news/2025/2/1 7:01:44 标签: websocket, 网络协议, 网络, java

一、什么是websocket

        WebSocket是一种在Web应用程序中实现实时双向通信的协议。它为浏览器和服务器之间提供了一种持久连接,在一个连接上可以双向传输数据。相比传统的HTTP协议,WebSocket具有更低的延迟和更高的效率。

        WebSocket使用了类似于握手的方式来建立连接。在握手过程中,浏览器和服务器会交换一些信息,以建立一个WebSocket连接。一旦连接建立,浏览器和服务器之间就可以实时地传输数据,而不需要每次都发起新的HTTP请求。

        WebSocket协议可以在不同的平台和编程语言中实现,包括Web浏览器和服务器端。在Web浏览器中,可以使用JavaScript中的WebSocket API来实现WebSocket连接。在服务器端,可以使用各种编程语言和框架来实现WebSocket服务器。

        WebSocket的应用场景非常广泛。它可以用于实时聊天应用、实时游戏、实时股票行情、实时协作编辑等需要实时通信的应用程序。通过WebSocket,开发人员可以更加方便地实现实时通信功能,提高用户体验。

        这里我们使用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>

三、代码 

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

服务器:

java">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;
    //所有连接到服务器的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)) {

            //创建链接成功时触发
            @Override
            public void onOpen(WebSocket webSocket, ClientHandshake clientHandshake) {
                sendMessage(webSocket,"孩子们,我回来了!");
                localSockets.add(webSocket);
            }

            //断开连接时触发
            @Override
            public void onClose(WebSocket webSocket, int i, String s, boolean b) {
                logger.info(webSocket.getRemoteSocketAddress() + "客户端与服务器断开连接");
                localSockets.remove(webSocket);
            }

            //接收到消息时触发
            @Override
            public void onMessage(WebSocket webSocket, String s) {
                logger.info("收到了客户端的消息:" + s);
                sendMessage(webSocket,"孩子们,我收到消息了");
            }

            //连接发送错误时调用,后触发onClose方法
            @Override
            public void onError(WebSocket webSocket, Exception e) {
                logger.info(webSocket.getRemoteSocketAddress() + "客户端与服务器连接发送错误");
                localSockets.remove(webSocket);
            }

            @Override
            public void onStart() {
                logger.info("孩子们我要启动了!!");
            }
        };
        socketServer.start();
        logger.info("Man!what can I say,我已经启动了");
    }

    /**
     * 一对一发送
     * @param webSocket:客户端
     * @param message:信息
     */
    public void sendMessage(WebSocket webSocket,String message){
        logger.info("发送给"+webSocket.getRemoteSocketAddress().getPort() + "的p2p消息是:" + message);
        webSocket.send(message);
    }

    /**
     * 一对多发送
     * @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("孩子们我燃尽了");
    }
}

客户端:

java">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);
    //服务器端的地址
    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("收到服务器发来的信息:"+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("连接错误");
        }
    }

    /**
     * 一对一发送
     * @param webSocket:客户端
     * @param message:信息
     */
    public void sendMessage(WebSocket webSocket,String message){
        logger.info("发送给"+webSocket.getRemoteSocketAddress().getPort() + "的p2p消息是:" + message);
        webSocket.send(message);
    }

    /**
     * 一对多发送
     * @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("孩子们我燃尽了");
    }
}


http://www.niftyadmin.cn/n/5839108.html

相关文章

微服务实战 原生态实现服务的发现与调用_如何发现应用的服务调用问题

总结 相关推荐 上一篇 Eureka注册中心及集群搭建 前言 上一章中&#xff0c;我们介绍了Eureka注册中心及集群的搭建&#xff0c;这一节将介绍服务的发现和调用。注意&#xff0c;这个时候我们只有注册中心&#xff0c;并没有引入其他的组件&#xff0c;所以需要使用SpringClo…

从训练到生产:AI 模型如何突破困境实现高效部署?

随着人工智能的发展&#xff0c;模型变得越来越复杂&#xff0c;导致规模增大和延迟增加&#xff0c;这给模型部署到生产环境带来了困难。在性能和效率之间保持平衡往往是一项具有挑战性的任务&#xff0c;模型越快、越轻量化&#xff0c;就越容易部署到生产环境中。在包含超过…

强化学习笔记——4策略迭代、值迭代、TD算法

基于策略迭代的贝尔曼方程和基于值迭代的贝尔曼方程&#xff0c;关系还是不太理解 首先梳理一下&#xff1a; 通过贝尔曼方程将强化学习转化为值迭代和策略迭代两种问题 求解上述两种贝尔曼方程有三种方法&#xff1a;DP&#xff08;有模型&#xff09;&#xff0c;MC&#xff…

DeepSeek 遭 DDoS 攻击背后:DDoS 攻击的 “千层套路” 与安全防御 “金钟罩”

当算力博弈升级为网络战争&#xff1a;拆解DDoS攻击背后的技术攻防战——从DeepSeek遇袭看全球网络安全新趋势 在数字化浪潮席卷全球的当下&#xff0c;网络已然成为人类社会运转的关键基础设施&#xff0c;深刻融入经济、生活、政务等各个领域。从金融交易的实时清算&#xf…

具身智能体空间感知基础!ROBOSPATIAL:评测并增强2D和3D视觉语言模型空间理解水平

作者&#xff1a;Chan Hee Song, Valts Blukis,Jonathan Tremblay, Stephen Tyree, Yu Su, Stan Birchfield 单位&#xff1a;俄亥俄州立大学&#xff0c;NVIDIA 论文标题&#xff1a;ROBOSPATIAL: Teaching Spatial Understanding to 2D and 3D Vision-Language Models for …

Web 视频播放前前后后那些事

所有这些网站实际上仍然使用video标签。但是&#xff0c;它们不只是在src属性中设置视频文件&#xff0c;而是使用功能更强大的Web API&#xff08;Media Source Extensions&#xff09;。 Media Source Extensions “Media Source Extensions”&#xff08;通常简称为“ MSE…

WPS怎么使用latex公式?

1、下载并安装mathtype https://blog.csdn.net/weixin_43135178/article/details/125143654?sharetypeblogdetail&sharerId125143654&sharereferPC&sharesourceweixin_43135178&spm1011.2480.3001.8118 2、将mathtype嵌入在WPS MathType面板嵌入器,免费工具…

玄机靶场--第二章 日志分析-apache日志分析

文章目录 第二章 日志分析-apache日志分析1、提交当天访问次数最多的IP&#xff0c;即黑客IP&#xff1a;2、黑客使用的浏览器指纹是什么&#xff0c;提交指纹的md5&#xff1a;3、查看包含index.php页面被访问的次数&#xff0c;提交次数&#xff1a;4、查看黑客IP访问了多少次…