## 定义

 WebSocket是通过单个TCP连接提供全双工(双向通信)通信信道的计算机通信协议。此WebSocket API可在用户的浏览器和服务器之间进行双向通信。用户可以向服务器发送消息并接收事件驱动的响应,而无需轮询服务器。 它可以让多个用户连接到同一个实时服务器,并通过API进行通信并立即获得响应。

案例介绍

  后端在接收到用户新下的订单后,通知到后台系统

服务端代码

pom.xml

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

websocket配置类

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter; /**
* websocket配置
* @author : wang zns
* @date : 2019-05-06
*/
@Configuration
public class WebSocketConfig { @Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
} }

websocket核心业务类

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.atomic.LongAdder; /**
* websocket服务端核心类
* @author : wang zns
* @date : 2019-05-06
*/
@ServerEndpoint("/websocket")
@Component
@Slf4j
public class WebSocketService { /**
* 记录当前websocket的连接数(保证线程安全)
*/
private static LongAdder connectAccount = new LongAdder(); /**
*存放每个客户端对应的websocketServer对象(需保证线程安全)
*/
private static CopyOnWriteArraySet<WebSocketService> webSocketSet = new CopyOnWriteArraySet<>();
/**
* 与客户端的连接对象
*/
private Session session; /**
* 连接成功调用的方法
* @param session
*/
@OnOpen
public void onOpen(Session session) {
this.session = session;
webSocketSet.add(this);
connectAccount.increment();
log.info("有新的连接接入,当前连接数为{}", connectAccount);
} /**
* 连接关闭时调用
*/
@OnClose
public void onClose() {
webSocketSet.remove(this);
connectAccount.decrement();
log.info("有连接关闭,当前连接数为{}", connectAccount);
} /**
* 收到客户端消息时调用
* @param message
*/
@OnMessage
public void onMessage(String message) {
log.info("收到客户端发来的消息,message -> {}", message);
} /**
* 服务端向客户端发送消息
* @param message
*/
public void sendMessage(String message) {
for (WebSocketService webSocketService : webSocketSet) {
try {
log.info("【websocket消息】 广播消息, message={}", message);
webSocketService.session.getBasicRemote().sendText(message);
} catch (IOException e) {
log.info("向客户端发送消息失败, {}", e.getMessage());
}
}
} }

客户端代码

在此案例中,我们的客户端为浏览器,所以直接通过js进行连接

<script>
var websocket;
if ('WebSocket' in window) {
websocket = new WebSocket('ws://127.0.0.1:9988/sell/websocket');
} else {
alert("你的浏览器暂不支持websocket,请更换其他浏览器再试");
} websocket.onopen = function (event) {
console.log("建立连接");
};
websocket.onclose = function (event) {
console.log("关闭连接");
};
websocket.onmessage = function (event) {
console.log("收到消息," + event.data);
// 弹窗提示与播放提示音乐
setTimeout(function () {
document.getElementById('notice').play();
},1000);
$("#orderModal").modal('show');
};
websocket.onerror = function (event) {
console.log("websocket异常");
};
/**
* readyState状态如下:
* CONNECTING:值为0,表示正在连接;
OPEN:值为1,表示连接成功,可以通信了;
CLOSING:值为2,表示连接正在关闭;
CLOSED:值为3,表示连接已经关闭,或者打开连接失败。
*/ // 向服务端发送消息(必须为open状态时可发送)
if (websocket.readyState === 1) {
websocket.send("服务端你好");
} </script>

效果演示

服务端

客户端

写在最后

  websocket的作用远不止这些,本文只是一种较为常见的用法; 在最后附上参考的blog -> Spring Boot整合websocket实现群聊,点对点聊天

springboot整合websocket实现客户端与服务端通信的更多相关文章

  1. Netty入门之客户端与服务端通信(二)

    Netty入门之客户端与服务端通信(二) 一.简介 在上一篇博文中笔者写了关于Netty入门级的Hello World程序.书接上回,本博文是关于客户端与服务端的通信,感觉也没什么好说的了,直接上代码 ...

  2. Android BLE与终端通信(三)——客户端与服务端通信过程以及实现数据通信

    Android BLE与终端通信(三)--客户端与服务端通信过程以及实现数据通信 前面的终究只是小知识点,上不了台面,也只能算是起到一个科普的作用,而同步到实际的开发上去,今天就来延续前两篇实现蓝牙主 ...

  3. 基于开源SuperSocket实现客户端和服务端通信项目实战

    一.课程介绍 本期带给大家分享的是基于SuperSocket的项目实战,阿笨在实际工作中遇到的真实业务场景,请跟随阿笨的视角去如何实现打通B/S与C/S网络通讯,如果您对本期的<基于开源Supe ...

  4. Python进阶----SOCKET套接字基础, 客户端与服务端通信, 执行远端命令.

    Python进阶----SOCKET套接字基础, 客户端与服务端通信, 执行远端命令. 一丶socket套接字 什么是socket套接字: ​ ​  ​ 专业理解: socket是应用层与TCP/IP ...

  5. netty-3.客户端与服务端通信

    (原) 第三篇,客户端与服务端通信 以下例子逻辑: 如果客户端连上服务端,服务端控制台就显示,XXX个客户端地址连接上线. 第一个客户端连接成功后,客户端控制台不显示信息,再有其它客户端再连接上线,则 ...

  6. Netty入门——客户端与服务端通信

    Netty简介Netty是一个基于JAVA NIO 类库的异步通信框架,它的架构特点是:异步非阻塞.基于事件驱动.高性能.高可靠性和高可定制性.换句话说,Netty是一个NIO框架,使用它可以简单快速 ...

  7. 二、网络编程-socket之TCP协议开发客户端和服务端通信

    知识点:之前讲的udp协议传输数据是不安全的,不可靠不稳定的,tcp协议传输数据安全可靠,因为它们的通讯机制是不一样的.udp是用户数据报传输,也就是直接丢一个数据包给另外一个程序,就好比寄信给别人, ...

  8. Python socket编程客户端与服务端通信

    [本文出自天外归云的博客园] 目标:实现客户端与服务端的socket通信,消息传输. 客户端 客户端代码: from socket import socket,AF_INET,SOCK_STREAM ...

  9. mina客户端与服务端通信的易错点

    使用mina进行项目开发时,如果客户端与服务端不在同一个项目下,需要关注一下两点: 第一.服务端与客户端的编码解码器一致 第二.过程中所用到的实体类的包名需要一致

随机推荐

  1. mysql添加索引(建表之后)

    一.使用ALTER TABLE语句创建索引 语法如下: alter table table_name add index index_name (column_list) ; alter table ...

  2. eclipse中一个项目引用另一个项目的方法

    我们在开发的时候,有时候需要把一个大的项目打散,尤其是现在微服务的架构很流行,一个大的项目往往被拆成很多小的项目,而有的项目作为公共工程被独立出来,比如有个工程专门提供各种Util工具类,有的工程专门 ...

  3. npm常用命令和脚手架使用

    最近前端同学使用最多的莫过于vue,angualr,react等热门前端框架了.那么就避免不掉的使用npm命令,本人就经常因为这三个脚手架的使用而不得不百度相应的npm命令,不胜其烦,,,因此就整理一 ...

  4. python爬虫2:按html标签提取信息和中文域名处理(BeautifulSoup用法初步)

    #!/usr/bin/env python # -*- coding: utf- -*- # python3 import string import urllib from urllib impor ...

  5. imx6ull+debian10 构建静态qt交叉编译环境

    # PC:Ubuntu18.04# GCC: arm-linux-gnueabihf- 7.4.0# 开发板:# imx6ull+debian10(文件系统为野火提供的) # 此处需要编译的是带gst ...

  6. c#画图之雷达图

    public JsonResult DrawRadar() { List<Color> colors = new List<Color>() { Color.FromArgb( ...

  7. 吴裕雄--天生自然 PYTHON数据分析:人类发展报告——HDI, GDI,健康,全球人口数据数据分析

    import pandas as pd # Data analysis import numpy as np #Data analysis import seaborn as sns # Data v ...

  8. SpringBoot项目自定义浏览器选项卡左上角图标(favicon.ico)-sunziren

    favicon.ico是浏览器选项卡左上角的图标,可以放在静态资源路径下或者类路径下面.静态资源路径下的favicon.ico优先级高于类路径下的favicon.ico. 可以使用在线转换网站http ...

  9. Spring Boot源码(六):Bean的创建详解

    继续之前的项目: People加上无参构造方法: @Component public class People { // private User user; public People(){ Sys ...

  10. [大数据技术]Kettle初次连接MySQL数据库 报错问题 错误连接数据库 Error occured while trying to connect to the database Exception while loading class org.gjt.mm.mysql.Driver

    报错内容如下: 错误连接数据库 [foodmartconn] : org.pentaho.di.core.exception.KettleDatabaseException: Error occure ...