WebSocket的一次了解,附GitHub地址

代码鄙视员 2019-02-22 17:42:03 ⋅ 887 阅读

原文作者:有井有田

原文链接:https://www.toutiao.com/a6659628227658514957

首先来点基础知识

WebSocket 是一种网络通信协议,很多高级功能都需要它。

本文介绍 WebSocket 协议的使用方法。


一、为什么需要 WebSocket?

初次接触 WebSocket 的人,都会问同样的问题:我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处?

答案很简单,因为 HTTP 协议有一个缺陷:通信只能由客户端发起。

举例来说,我们想了解今天的天气,只能是客户端向服务器发出请求,服务器返回查询结果。HTTP 协议做不到服务器主动向客户端推送信息。


这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。我们只能使用"轮询":每隔一段时候,就发出一个询问,了解服务器有没有新的信息。最典型的场景就是聊天室。

轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开)。因此,工程师们一直在思考,有没有更好的方法。WebSocket 就是这样发明的。

二、简介

WebSocket 协议在2008年诞生,2011年成为国际标准。所有浏览器都已经支持了。

它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。

这个图片清晰说明了http和socket的不同

其他特点包括:

(1)建立在 TCP 协议之上,服务器端的实现比较容易。

(2)与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。

(3)数据格式比较轻量,性能开销小,通信高效。

(4)可以发送文本,也可以发送二进制数据。

(5)没有同源限制,客户端可以与任意服务器通信。

(6)协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。


ws://example.com:80/some/path


服务器端,采用SpringBoot的spring-boot-starter-websocket

客户端就是浏览器啦,目前的浏览器几乎都支持了

先上服务端代码:

@Component
@ServerEndpoint("/webSocket")
//@Slf4j
public class WebSocket {
private Session session;
private Logger log = LoggerFactory.getLogger(WebSocket.class);
private static CopyOnWriteArraySet<WebSocket> webSocketSet = new CopyOnWriteArraySet<>();
@OnOpen
public void onOpen(Session session) {
log.info("socket服务端开启....");
this.session = session;
webSocketSet.add(this);
log.info("【websocket消息】 有新的连接,总数:{}", webSocketSet.size());
}
@OnClose
public void onClose() {
webSocketSet.remove(this);
log.info("【websocket消息】 连接断开,总数:{}", webSocketSet.size());
}
@OnMessage
public void onMessage(String message) {
log.info("【websocket消息】 收到客户端发来的消息:{}", message);
}
public void sendMessage(String message) {
for (WebSocket webSocket : webSocketSet) {
log.info("【websocket消息】 广播消息,message={}", message);
try {
webSocket.session.getBasicRemote().sendText(message);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter(){
return new ServerEndpointExporter();
}
}

上面的代码就是启动服务端了,

服务器端向客户端发送消息

下面看看客户端的情况

客户端代码(html)

目前这个demo是广播性质的,就是说,服务端发送消息,所有连接的客户端都能收到。如果想实现网络聊天室的功能就需要点对点的发送信息,有时间再讲。

demo项目代码地址:https://github.com/tigerhoo/websocket-boot

---------------END----------------

后续的内容同样精彩

长按关注“IT实战联盟”哦




全部评论: 0

    我有话说:

    VUE 开源库收藏版():史上最全面学习资源 ,GitHub源码地址

    VUE 开源库收藏版():史上最全面学习资源 ,GitHub源码地址

    VUE 开源库收藏版(二):史上最全面学习资源 ,GitHub源码地址

    最近做了一个Vue开源项目库汇总,里面集合了OpenDigg 上优质Vue开源项目库,方便移动开发人员便捷找到自己需要项目工具等,感兴趣可以到GitHub上给个star。

    使用mybatis-generator自动生成代码(GitHub下载地址

    大家都知道Mybatis属于半自动ORM,在使用这个框架中,工作量最大就是书写Mapping映射文件,并且手动书写很容易出错,那么今天来介绍一下使用Mybatis-Generator来帮我们自动

    SpringBoot+zk+dubbo架构实践(四):sb+zk+dubbo框架搭建(内源码GitHub地址

    本篇案例模拟了一个provider服务提供方和PC、Web两个服务消费方内GitHub源码......

    GitHub竟然有基于SpringCloud“网约车”项目,源码

    有人问小编有没有开源“网约车”项目源码,并且最好是采用微服务架构设计,这样可以投入技术团队进行二开发。 小编在GitHub上还真找到了这个项目,接下来一起看看吧! 项目介绍 该项目是款标准且

    iOS实战篇:[译]iOS扩充--OCR光学字符识别(内项目GitHub地址

    OCR(Optical Character Recognition) 光学字符识别, 是从图像中电子扫描提取文本过程, 可以在文档编辑等多种形式重用它,例如: 文本搜索/压缩等用途。

    SpringBoot+zk+dubbo架构实践(五):搭建微服务电商架构(内GitHub地址

    集成了mybatis和swagger让接口可视化并完成了一些增删改查基础业务,对了还有个分页查询!

    分享:深夜优化亿级数据分页奇妙经历

    了起来,看是我们一个开发同学,顿时紧张了起来...

    【分享】单体架构改造成微服务架构拆分实践

    从5个方面设计这次微服务拆分方案,以及经验总结!

    架构实战篇(十二):Spring Boot 分布式Session共享Redis

    分布式Web网站一般都会碰到集群session共享问题,小编整理了套解决方案,内GitHub 源码地址哦~~~

    二代身份证校验过程

    、特别行政区)。第3-4位表示市(地级市、自治州、盟...

    精品推荐:基于SpringBoot2.0企业级开发脚手架

    SmallBun是参考多个优秀开源项目及自身学习、经验运用,高度整合封装而成高效,高性能,强安全性开源项目,内Git源码地址

    iOS直播---主要概念()

    直播可谓风生水起, 热火朝天, 借此也对音视频进行深入学习, 希望有需要大家一块学习.第一步对直播

    「轻阅读」图文并茂带你了解分布式架构演进

    初始阶段架构初始阶段 小型系统 应用程序、数据库、文件等所有资源都在台服务器上通俗称LAMP

    挖那些让公司网站瘫痪SQL“终结者”

    条慢查询会造成什么后果?之前我一直觉得不就是返回数据会慢一些么,用户体验变差? 其实远远不止,我经历过几线上事故,有就是由条 SQL 慢查询导致。 那条 SQL 查询耗时达到 2

    精品推荐:一览GitHub上最受程序欢迎5大Java开源项目

    列举了GitHub上一些最流行Java项目。从Mockitos到Guava,以及 java-design-patterns等供大家学习。

    『黑科技』开源 IP 地址定位库 ip2region,99.9%准确率

    ip2region 是什么?ip2region 是准确率 99.9% IP 地址定位库,0.0x毫秒级查

    能够替代 Jenkins 13个解决方案,了解下!

    Jenkins 是目前最常用持续集成工具,拥有近 50% 市场份额,它还是很多技术团队第一个使用自动化工具。但是随着自动化领域持续发展,Jenkins 逐渐暴露出了一些问题,例如缺乏功能

    【SpringCloud实战】开发中使用Feign添加动态Header问题思考

    踩了一个Spring Cloud Feign添加自定义Header坑,分享给大家