WebScoket-服务器客户端双向通信
WebScoket学习笔记
1. 消息推送常用方式介绍
轮询
浏览器以指定的时间间隔向服务器发出HTTP请求,服务器实时返回数据给浏览器。

长轮询
浏览器发出ajax请求,服务器端接收到请求后,会阻塞请求直到有数据或者超时才返回。

SSE
server-sent-event:服务器发送事件
SSE是在服务器和客户端之间打开一个单向通道,服务器通向客户端。
服务器响应的不再是一次性的数据包,而是text/event-stream类型的数据流信息。
服务器有数据变更时,将数据流式传输到客户端。

2. WebSocket
2.1 介绍
WebSocket是一种在基于TCP连接上进行全双工通信的协议。
说明:
- 全双工:允许数据在两个方向上同时传输。
- 半双工:允许数据在两个方向上传输,但是同一个时间段内只允许一个方向上传输。

2.2 客户端API
websocket对象创建
let ws = new WebSocket(URL);
URL说明
- 格式:协议://ip地址:端口/访问路径
- 协议:协议名称为
ws
websocket对象相关事件
| 事件 | 事件处理程序 | 描述 |
|---|---|---|
| open | ws.onopen | 连接建立时 |
| message | ws.onmessage | 客户端接受到服务器发送到数据时触发 |
| close | ws.onclose | 连接关闭时触发 |
| error | ws.onerror | 发生错误时触发 |
websocket对象提供的方法
send():通过websocket对象调用该方法发送数据给服务端。
<script>
let ws = new WebSocket("ws://localhost:8080/chat")
ws.onopen = function (){
}
ws.onmessage = function (evt) {
console.log(evt)
}
ws.onclose = function () {
}
ws.onerror = function (){
}
</script>
2.3 服务端API
Tomcat的7.0.5版本开始支持websocket,并且实现了Java websocket规范。
Java websocket应用由一系列的Endpoint组成。Endpoint是一个java对象,代表WebSocket链接的一端,对于服务端,我们可以视为处理具体websocket消息的接口。
我们可以通过两种方式定义Endpoint:
- 第一种是编程式,即继承类
javax.websocket.Endpoint并实现其方法。 - 第二种是注解式,即定义一个POJO,并添加
@ServerEndpoint相关注解。
Endpoint实例在WebSocket握手时创建,并在客户端与服务端链接过程中有效,最后在链接关闭时结束。在Endpoint接口中明确定义了与其生命周期相关的方法,规范实现者确保生命周期的各个阶段调用实例的相关方法。生命周期方法如下:
| 方法 | 描述 | 注解 |
|---|---|---|
| onOpen() | 当开启一个新的会话时调用,该方法是客户端与服务器端握手成功后调用的方法 | @OnOpen |
| onClose() | 当会话关闭时调用 | @OnClose |
| onError() | 当连接过程异常时调用 | @OnError |
服务器端接受客户端数据
编程式
通过添加
MessageHandler消息处理器来接收消息注解式
在定义
Endpoint时,通过@OnMessage注解指定接收消息的方法
服务器端推送数据到客户端
发送消息则由RemoteEndpoint完成,其实例由Session维护。
发送消息有2种方式
- 通过
session.getBasicRemote获取同步消息发送的实例,然后调用其sendXXX()方法发送消息。 - 通过
session.getAsyncRemote获取异步消息发送实例,然后调用其sendXXX()方法发送消息。
@ServerEndpoint("/chat")
@Component
public class ChatEndpoint {
@OnOpen
public void onOPen(Session session,EndPointConfig config){
}
@OnMessage
public void onMessage(String message){
}
@OnClose
public void onClose(Session session){
}
}
3. 总结
新建SpringBoot项目,导入依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
编写配置类,扫描所有添加@ServerEndpoint注解的Bean:
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
编写配置类,用户获取HttpSession对象
@Configuration
public class GetHttpSessionConfigurator extends ServerEndpointConfig.Configurator {
@Override
public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) {
HttpSession session = (HttpSession) request.getHttpSession();
// 将HttpSession对象存储到配置对象中
sec.getUserProperties().put(HttpSession.class.getName(), session);
}
}
在@ServerEndpoint注解中引入配置器
@ServerEndpoint(value = "/chat",configurator = GetHttpSessionConfigurator.class)
创建ChatEndPoint
@Component
@ServerEndpoint(value = "/chat",configurator = GetHttpSessionConfigurator.class)
public class ChatEndpoint {
private static final Map<String, Session> onlineUsers = new ConcurrentHashMap<>();
private HttpSession httpSession;
@OnOpen
public void onOpen(Session session, EndpointConfig config) {
this.httpSession = (HttpSession) config.getUserProperties().get(HttpSession.class.getName());
}
public void broadcastAllUser(){
}
@OnMessage
public void onMessage(String message, Session session) {
}
@OnClose
public void onClose(Session session, CloseReason closeReason) {
}
}
服务器向客户端发送消息:
session.getAsyncRemote().sendText("...");
客户端向服务器发送消息:
let ws = new WebSocket("ws://localhost:8080/chat")
ws.send("xxx");
WebScoket-服务器客户端双向通信的更多相关文章
- Linux开发板(树莓派)和服务器进行双向通信(socket)
前言 物联网是目前嵌入开发必备的属性之一,我们常常需要把自己开发板和云端进行交互,本篇博文就记录一下. 使用Socket来实现Linux开发板和服务器进行双向通信,Python中是默认集成了s ...
- 安卓DJ113舞曲网应用客户端 项目源码(服务器+客户端)
Android DJ113舞曲网app客户端 播放器源码 项目源码(服务器+客户端),这个项目整体有点类似天天动听的效果,非常漂亮的,支持第三方登录等功能,非常完整的一个音乐项目. 源码下载:htt ...
- C#中国象棋+游戏大厅 服务器 + 客户端源码
来源:www.ajerp.com/bbs C#中国象棋+游戏大厅 服务器 + 客户端源码 源码开源 C#版中国象棋(附游戏大厅) 基于前人大虾的修改版 主要用委托实现 服务器支持在线人数,大厅桌数的设 ...
- 运用socket实现简单的服务器客户端交互
Socket解释: 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. Socket的英文原义是“孔”或“插座”.作为BSD UNIX的进程通信机制,取后一种意 ...
- CentOS_6.5 64位系统,安装git服务器+客户端
================ git服务器安装 ==================== CentOS安装Git服务器 Centos 6.4 + Git 1.8.2.2 + gitosis## . ...
- nginx配置SSL实现服务器/客户端双向认证
http://blog.csdn.net/kunoy/article/details/8239653 本人不才,配置了两天,终于搞出来了,结合网上诸多博文,特此总结一下! 配置环境: Ubuntu 1 ...
- Java新AIO/NIO2:AsynchronousServerSocketChannel和AsynchronousSocketChannel简单服务器-客户端
Java新AIO/NIO2:AsynchronousServerSocketChannel和AsynchronousSocketChannel简单服务器-客户端用AsynchronousServerS ...
- c++下基于windows socket的单线程服务器客户端程序(基于TCP协议)
今天自己编写了一个简单的c++服务器客户端程序,注释较详细,在此做个笔记. windows下socket编程的主要流程可概括如下:初始化ws2_32.dll动态库-->创建套接字-->绑定 ...
- c++下基于windows socket的服务器客户端程序(基于UDP协议)
前天写了一个基于tcp协议的服务器客户端程序,今天写了一个基于UDP协议的,由于在上一篇使用TCP协议的服务器中注释已经较为详细,且许多api的调用是相同的,故不再另外注释. 使用UDP协议需要注意几 ...
- kaldi - Online Audio Server(服务器客户端建立方法-旧版在线解码)
目录 一.服务器客户端识别系统建立方法 1. Command line to start the server(服务器端启动方式): 2. Command line to start the clie ...
随机推荐
- Netty 缓存buffer介绍及使用
每当你需要传输数据时,它必须包含一个缓冲区.Java NIO API 自带的缓冲区类是相当有限的,没有经过优化,使用 JDK 的ByteBuffer 操作更复杂.缓冲区是一个重要的组建,它是 API的 ...
- 冒泡排序------python实现
if __name__ == '__main__': ''' 算法描述 1.比较相邻的元素,更具大小交互位置 2.对每一对相邻元素作同样的工作,从开始第一队到结尾的最后一对,即可选出最大的数 3.所有 ...
- Qt编写视频监控系统75-计算实时码率并显示
一.前言 做监控摄像头的实时视频显示,一般还会要求统计实时码率显示在通道画面上,一个是为了测试下整个软件的性能,同时也看下当前到底是主码流还是子码流,设备到底是不是真的按照设定的码流大小来传输视频数据 ...
- SSM或Spring Boor开发中@Repository和@Mapper的区别
在做一个SpringBoot项目的时候在Dao层使用了@Repository注解然后报了这个错: Description: Field userService in com.example.demo. ...
- XXL-JOB原理--定时任务框架简介
一.完整介绍地址:官方介绍 https://www.xuxueli.com/xxl-job/#/?id=%E4%B8%80%E3%80%81%E7%AE%80%E4%BB%8B 二.最新版本架构图: ...
- weblogic-copy
一.简介 WebLogic是美国Oracle公司出品的一个application server,确切的说是一个基于JAVAEE架构的中间件,WebLogic是用于开发.集成.部署和管理大型分布式Web ...
- 分布式文件系统KFS基础知识介绍
Kosmos distributed file system,简称KFS,是一个类GFS的分布式文件系统,被设计用于分布式的结构化存储.下面将对KFS的体系结构进行简单介绍,最后给出一个使用KFS C ...
- Docker实践:Centos下安装Docker并简单的使用
1 环境介绍 版本信息: [root@localhost]# cat /proc/version Linux version 3.10.0-514.el7.x86_64 (builder@kbuil ...
- 使用pkg对nodejs项目打包
pkg的介绍可以阅读官方说明.下面针对使用做一个简单的说明. 1. 安装, 假设需要将项目打包成 win-x86 下运行的软件包,需要确定使用的 pkg 和 pkg-fecth 的版本,目前最后一个 ...
- GIS数据合集:作物、植被数据下载平台整理
本文对目前主要的作物类型与产量.植被物候与指数数据产品的获取网站加以整理与介绍. 目录 4 植被农业数据 4.1 作物产量数据 4.1.1 SPAM 4.1.2 Aerial Intelligen ...