当前位置: 首页 > article >正文

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

一、什么是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>

三、代码 

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

服务器:

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("孩子们我燃尽了");
    }
}

客户端:

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("孩子们我燃尽了");
    }
}

原文地址:https://blog.csdn.net/2301_77523019/article/details/145409019
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/527085.html

相关文章:

  • stm32教程:EXTI外部中断应用
  • 青少年编程与数学 02-008 Pyhon语言编程基础 08课题、变量与赋值
  • 本地部署DeepSeek
  • 什么是共模电压
  • 对比DeepSeek、ChatGPT和Kimi的学术写作撰写引言能力
  • 169 多数元素
  • 数据加密到信息安全算法
  • 程序员学英文之At the Airport Customs
  • Python NumPy(10):NumPy 统计函数
  • 初始化mysql报错cannot open shared object file: No such file or directory
  • android Camera 的进化
  • 三份网络与信息安全管理员(4级)题库(附参考答案)
  • 【LLM】DeepSeek-R1-Distill-Qwen-7B部署和open webui
  • 前端面试笔试题目(一)
  • 数据结构:队列篇
  • 1-2 飞机大战游戏场景
  • 磁感应编码器实现原理和C语言实现
  • 讯飞绘镜(ai生成视频)技术浅析(四):图像生成
  • MinDoc 安装与部署
  • C++范围for和auto关键字