IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> Springboot 配置Java WebSocket例子 -> 正文阅读

[网络协议]Springboot 配置Java WebSocket例子

亲测可用。

1.pom.xml

<!-- webSocket 开始-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>

        <dependency>
            <groupId>javax.websocket</groupId>
            <artifactId>javax.websocket-client-api</artifactId>
            <version>1.1</version>
        </dependency>

2.注入配置:

package com.simons.websocket;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

@Configuration
public class WebSocketConfigOne {
    /**
     * 这个bean会自动注册使用了@ServerEndpoint注解声明的对象
     * 没有的话会报404
     *
     * @return
     */
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }

}

3. 服务端实现

package com.simons.websocket;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;
/**
 * @ServerEndpoint 该注解可以将类定义成一个WebSocket服务器端,
 * @OnOpen 表示有浏览器链接过来的时候被调用
 * @OnClose 表示浏览器发出关闭请求的时候被调用
 * @OnMessage 表示浏览器发消息的时候被调用
 * @OnError 表示报错了
 */
@ServerEndpoint("/ws/serverOne")
@Component
public class WebSocketServerOne {
    //concurrent包下线程安全的Set
    public static  CopyOnWriteArraySet<WebSocketServerOne> SESSIONS = new CopyOnWriteArraySet<>();
    private Session session;

    public Session getSession() {
        return session;
    }

    public void setSession(Session session) {
        this.session = session;
    }

    @OnOpen
    public void onOpen(Session session) {
        this.session = session;
        SESSIONS.add(this);
        System.out.println(String.format("成功建立连接~ 当前总连接数为:%s", SESSIONS.size()));
        System.out.println(this);
        System.out.println("是否开启了:"+session.isOpen());
        System.out.println("session通道是否存在?"+"sessonId:"+session.getId()+":"+(session.getAsyncRemote()!=null?"是":"否"));

    }
    @OnClose
    public void onClose(Session session) {
//        SESSIONS.remove(this);
        System.out.println("是否开启了:"+session.isOpen());
        System.out.println("session通道是否存在?"+"sessonId:"+session.getId()+":"+(session.getAsyncRemote()!=null?"是":"否"));
        System.out.println(String.format("成功关闭连接~ 当前总连接数为:%s", SESSIONS.size()));

    }
    @OnMessage
    public void onMessage(String message, Session session) {
        System.out.println(message);
    }
    @OnError
    public void onError(Session session, Throwable error) {
        System.out.println("发生错误");
        error.printStackTrace();
    }
    /**
     * 指定发消息
     *
     * @param message
     */
    public void sendMessage(String message) {
        try {
            this.session.getBasicRemote().sendText(message);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * 群发消息
     *
     * @param message
     */
    public static void fanoutMessage(String message) {
        SESSIONS.forEach(ws -> ws.sendMessage(message));
    }
}

4.前端实现

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>webSocket</title>
  <style type="text/css">
  </style>
</head>
<body>
<h1>WebSocket Demo.</h1>
<h1>WebSocket Demo..</h1>
<h1>WebSocket Demo...</h1>
<input type="button" onclick="websocket.send('666666666')" value="点我发消息"/>
<input type="button" onclick="websocket.close()" value="关闭"/>
</body>
<script type="application/javascript">
  var websocket = {
    send: function (str) {
    }
  };
  window.onload = function () {
    if (!'WebSocket' in window) return;
    webSocketInit();
  };
  function webSocketInit() {
    websocket = new WebSocket("ws://127.0.0.1:8080/ws/serverOne");
    //成功建立连接
    websocket.onopen = function () {
      setMessageInnerHTML("成功连接到服务器");
    };
    //接收到消息
    websocket.onmessage = function (event) {
      console.log(event.data)
    };
    //连接发生错误
    websocket.onerror = function () {
      setMessageInnerHTML("WebSocket连接发生错误");
    };
    //连接关闭
    websocket.onclose = function () {
      setMessageInnerHTML("WebSocket连接关闭");
    };
    //监听窗口关闭事件,当窗口关闭时,主动关闭websocket连接
    // window.onbeforeunload = function () {
    //   websocket.close()
    // };
  }
</script>
</html>

5.跑一个定时器查看一下服务器每个连接Session的状态

package com.simons.websocket;

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;

import javax.websocket.Session;
import java.util.Iterator;

@Configuration      //1.主要用于标记配置类,兼备Component的效果。
@EnableScheduling   // 2.开启定时任务
public class Jobs {
    //3.添加定时任务
//    @Scheduled(cron = "0/5 * * * * ?")
    //或直接指定时间间隔,例如:5秒
    @Scheduled(fixedRate=1000*2)
    private void configureTasks() {
        System.out.println("定时任务开始");
        Iterator it = WebSocketServerOne.SESSIONS.iterator();
        while (it.hasNext()) {

            WebSocketServerOne webSocketServerOne = (WebSocketServerOne) it.next();
            Session session = webSocketServerOne.getSession();
            System.out.println(session.getId()+":"+ session.isOpen());
//            System.out.println(str);
        }
    }
}

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-03-10 22:59:52  更:2022-03-10 23:00:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年10日历 -2024/10/5 13:25:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码