websocket学习

SQLSTATE58030 在优化一条SQL的时候遇到了执行错误 gtlions =# select t1.telnumber,t2.ua,t2.url,t1.apply_name,t2.apply_name from tb1 t1 gtlions -# left outer join tb2 t2 on t1.sid = t2.ipsid gtlions-# where t1.sum_date=20141128 a 阅读详情

消息推送

实现实时信息传递传统的方式有两种,一种是ajax轮询,一种是http long poll。
首先是ajax轮询,ajax轮询的原理非常简单,让浏览器隔个几秒就发送一次请求,询问服务器是否有新信息。这个机制的缺点一是实时性不够,二是频繁的请求会给服务器带来极大的压力。
http long poll其实原理跟ajax轮询差不多,都是采用轮询的方式,不过采取的是阻塞模型(一直打电话,没收到就不挂电话),也就是说,客户端发起连接后,如果没消息,就一直不返回响应给客户端。直到有消息才返回,返回完之后,客户端再次建立连接,周而复始。这个机制暂时地解决了实时性问题,但是它带来了新的问题:以多线程模式运行的服务器会让大部分线程大部分时间都处于挂起状态,极大地浪费服务器资源。
传统的HTTP协议不能做到WebSocket实现的功能,是因为HTTP协议是一个请求-响应协议,请求必须先由浏览器发给服务器,服务器才能响应这个请求,再把数据发送给浏览器。换句话说,浏览器不主动请求,服务器是没法主动发数据给浏览器的。
所以为了在浏览器和服务器之间建立一个不受限的双向通信的通道,比如说,服务器可以在任意时刻发送消息给浏览器,HTML5推出了WebSocket标准,让浏览器和服务器之间可以建立无限制的全双工通信,任何一方都可以主动发消息给对方。
HTTP与WebSocket
它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。
此外,还包括以下特点:
(1)建立在 TCP 协议之上,服务器端的实现比较容易。
(2)与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。
(3)数据格式比较轻量,性能开销小,通信高效。
(4)可以发送文本,也可以发送二进制数据。
(5)没有同源限制,客户端可以与任意服务器通信。
(6)协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。

java WebSocket实现

websocket简单实现分为以下几个步骤:添加websocket库、编写后台代码、编写前端代码

添加websocket库
<dependency>
   <groupId>javax.websocket</groupId>
   <artifactId>javax.websocket-api</artifactId>
   <version>1.1</version>
   <scope>provided</scope>
</dependency>
编写后台代码

后台实现websocket有两种方式:使用继承类、使用注解;注解方式比较方便,以下代码中使用注解方式来进行演示。
声明websocket地址类似Spring MVC中的@controller注解类似,websocket使用@ServerEndpoint来进行声明接口:@ServerEndpoint(value="/websocket/{paraName}") ; 其中 “ { } ”用来表示带参数的连接,如果需要获取{}中的参数在参数列表中增加:@PathParam(“paraName”) Integer userId 。则连接地址形如:ws://localhost:8080/project-name/websocket/8,其中每个连接可以设置不同的paraName的值。
注解、成员数据介绍:
1.@OnOpen
有连接时的触发函数。 我们可以在用户连接时记录用户的连接带的参数,只需在参数列表中增加参数:@PathParam(“paraName”) String paraName。
2.@OnClose
连接关闭时的调用方法。
3.@OnMessage
收到消息时调用的函数,其中Session是每个websocket特有的数据成员,详情见4.
4.Session
每个Session代表了两个websocket断点的会话;当websocket握手成功后,websocket就会提供一个打开的Session,可以通过这个Session来对另一个端点发送数据;如果Session关闭后发送数据将会报错。
5.Session.getBasicRemote().sendText(“message”)
向该Session连接的用户发送字符串数据。
6.@OnError
发生意外错误时调用的函数。

@ServerEndpoint(value="/websocketTest/{userId}")
public class Test {
    private Logger logger = LoggerFactory.getLogger(Test.class);
    private static String userId;
    
    //连接时执行
    @OnOpen
    public void onOpen(@PathParam("userId") String userId,Session session) throws IOException{
        this.userId = userId;
        logger.debug("新连接:{}",userId);
    }
    
    //关闭时执行
    @OnClose
    public void onClose(){
        logger.debug("连接:{} 关闭",this.userId);
    }
    
    //收到消息时执行
    @OnMessage
    public void onMessage(String message, Session session) throws IOException {
        logger.debug("收到用户{}的消息{}",this.userId,message);
        session.getBasicRemote().sendText("收到 "+this.userId+" 的消息 "); //回复用户
    }
    
    //连接错误时执行
    @OnError
    public void onError(Session session, Throwable error){
        logger.debug("用户id为:{}的连接发送错误",this.userId);
        error.printStackTrace();
    }
}
编写前端代码
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        websocket Demo---- user000 <br />
        <input id="text" type="text" /> 
        <button onclick="send()"> Send </button>   
        <button onclick="closeWebSocket()"> Close </button>
        <div id="message">   </div>
        
    <script type="text/javascript">
     //判断当前浏览器是否支持WebSocket
      if('WebSocket' in window){
          websocket = new WebSocket("ws://localhost:8080/Demo/websocketTest/user000");
          console.log("link success")
      }else{
          alert('Not support websocket')
      }
      
      //连接发生错误的回调方法
      websocket.onerror = function(){
          setMessageInnerHTML("error");
      };
       
      //连接成功建立的回调方法
      websocket.onopen = function(event){
          setMessageInnerHTML("open");
      }
       console.log("-----")
      //接收到消息的回调方法
      websocket.onmessage = function(event){
            setMessageInnerHTML(event.data);
      }
       
      //连接关闭的回调方法
      websocket.onclose = function(){
          setMessageInnerHTML("close");
      }
       
      //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
      window.onbeforeunload = function(){
          websocket.close();
      }
       
      //将消息显示在网页上
      function setMessageInnerHTML(innerHTML){
          document.getElementById('message').innerHTML += innerHTML + '<br/>';
      }
       
      //关闭连接
      function closeWebSocket(){
          websocket.close();
      }
       
      //发送消息
      function send(){
          var message = document.getElementById('text').value;
          websocket.send(message);
      }
    </script>
    </body>
</html>

总结

websocket特别适合于需要实时数据传送的场景,比轮询方式效率高很多。

CentOS 7 安装 Python 3.10 我这里已经软链接了,正常未链接之前是python->python2.7而不是python3.10。python2.7默认安装是在 /usr/bin目录中,切换到/usr/bin/更改yum配置,因为其要用到python2才能执行,否则会导致yum不能正常使用。2. 安装 Python 3.10 必需的 openssl >= 1.1.1。默认的centos7是没有安装pip,先添加epel扩展源。/usr/bin/python 修改为如下。添加软链接,将原来的链接备份。添加python3的软链接。 阅读详情

相关推荐

vue使用websocket

websocket其他特点如下: (1)建立在 TCP 协议之上,服务器端的实现比较容易。 (2)与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。 (3)数据格式比较轻量,性能开销小,通信高效。 (4)可以发送文本,也可以发送二进制数据。 (5)没有同源限制,客户端可以与任意服务器通信...

高山景行,一尘不染 1125

webSocket的使用

WebSocket是HTML5下一种新的协议。它实现了浏览器与服务器全双工通信,与HTTP一样通过已建立的TCP连接来传输数据,但是它和HTTP最大不同是:1)WebSocket是一种双向通信协议。在建立连接后,WebSocket服务器端和客户端都能主动向对方发送或接收数据,就像Socket一样; 2)WebSocket需要像TCP一样,先建立连接,连接成功后才能相互通信。 传统的http客户...

qq_43154385的博客 1405

星星充电数据demo.7z

星星充电数据demo.7z

soul之websocket数据同步

soul数据同步之websocket 1. 在【soul-admin】中开启websocket同步 soul: sync: websocket: enabled: true 2. 在【soul-bootstrap】中添加websocket数据同步依赖 <dependency> <groupId>org.dromara</groupId> <artifactId>soul-

Ti_an_Di的博客 1386

websocket的坑,同时有多个线程调用了this.session.getBasicRemote().sendText(msg); 方法

websocket的坑,The remote endpoint was in state [TEXT_FULL_WRITING] which is an invalid state for called method@TOC 使用websocket 做实时聊天系统,在生产环境上有业务人员反馈收不到消息,查看日志发现有很多The remote endpoint was in state [TEXT_FULL_WRITING] which is an invalid state for called metho

jzmgy的博客 6822

2021-05-26

springboot+websocket+redis搭建 一、在pom.xml文件中添加 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> <version>2.2.10.RELEASE</version> </dep

paj123456789的博客 615

WebSocket 学习笔记

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

mio1012436的博客 1112

如何学习 websocket ?

如何学习 websocket ? 使用 HTML https://github.com/phoboslab/jsmpeg MPEG1 进行播放 https://w3c.github.io/media-source/ 使用原始 API 使用 canvas 绘制图像,通过 API URL.createObjectURL(Blob or ArrayBuffer) 拿到数据 ArrayBuffer Bl...

weixin_30517001的博客 181

Pig4cloud学习版使用websocket的过程

使用sping4cloud3.8.2整合websocket功能遇到的问题和最终解决方法

sunxuthydrology的博客 1493

【备忘】websocket学习之挖坑埋自己

虽然这个问题让我花了3天来寻找问题所在,但是也在过程中学习了掌握了很多知识点,毕竟是从0开始学websocket,也是实战项目,想来这样也好,遇到的问题越多,经验涨得也越快!功夫不负有心人,有心,大概说的就是坚持吧,不负,大概就是说的结果吧。

qq_15941409的博客 558

webSocket 学习

WebSocket 是一种在单个 TCP 连接上进行全双工通信的网络协议。它是 HTML5 中的一种新特性,能够实现 Web 应用程序和服务器之间的实时通信,比如在线聊天、游戏、数据可视化等。相较于 HTTP 协议的请求-响应模式,使用 WebSocket 可以建立持久连接,允许服务器主动向客户端推送数据,避免了不必要的轮询请求,提高了实时性和效率。

qq1195566313的博客 8470

WebSocket 系统学习笔记

WebSocket 是一种基于TCP协议的新型网络协议,实现了(类似电话通话,双方可同时发送接收数据)。只需一次握手即可建立持久连接,支持双向数据传输。

2301_81511613的博客 1223

【网络】WebSocket学习总结

避免网络阻塞:WebSocket会受到网络阻塞的影响,当有太多的数据连接同时请求时,服务器性能会下降,使用更合适的线程池和异步IO操作可以避免线程阻塞,提高WebSocket的并发性能。使用CDN(内容分发网络)加速:可以将静态资源缓存到离用户更近的节点上,提高传输速度和性能,CDN可以缓存WebSocket的初始握手,避免不必要的网络延迟;更好的服务端资源管理:WebSocket可以保持持续活动的连接状态,服务端可以更好地管理客户端的连接,减少服务端的开销和处理时间。通过单一的TCP提供了持久化连接;

weixin_47220117的博客 573

WebSocket学习

本人分享一下这次字节跳动、美团、头条等大厂的面试真题涉及到的知识点,以及我个人的学习方法、学习路线等,当然也整理了一些学习文档资料出来是给大家的。知识点涉及比较全面,包括但不限于前端基础,HTML,CSS,JavaScript,Vue,ES6,HTTP,浏览器,算法等等开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】TML,CSS,JavaScript,Vue,ES6,HTTP,浏览器,算法等等**

2401_84433807的博客 1080

WebSocket学习笔记

这篇文章是WebSocket学习笔记,介绍了WebSocket的基本概念、优劣势及使用方法,并附有应用示例。

君主,永远在高峰等你 1581

WebSocket案例

websocket案例

qq_51076413的博客 710

SpringBoot——SpringBoot集成WebSocket实现简单的多人聊天室

SpringBoot——SpringBoot集成WebSocket实现简单的多人聊天室

贝尔摩德苦艾酒 1万+

websocket getAsyncRemote()getBasicRemote()区别

最近项目中要定时向前台web页面推送消息,便用websocket来做消息推送,websocket  session发送文本消息有两个方法:getAsyncRemote()getBasicRemote() 同事推荐使用getAsyncRemote()这个方法,网上找了下解释:就是getAsyncRemote是非阻塞式的,getBasicRemote是阻塞式的,表示不懂。推送消息的过程中遇到了一个b

自由的刺猬 5万+

tomcat websocket 并发问题解决(一)

问题起源 公司应用内有一个基于websocket的聊天室功能,一直有用户反应高峰时段聊天信息延迟的厉害,终于找时间抽空解决了一下。 首先通过日志发现,聊天室/直播间内用户稍微多一点的情况下(30-50人),广播一条消息就会非常耗时,常常达到 10-20s 检查代码发现 SessionUtil 的 sendMessage 方法内,有如下一段代码(精简): <spanclass="hljs-selector-tag">if</span>(session.isOpen())...

詹Sir的博客 3396

使用websocket实现服务端主动发送消息到客户端

平时我们都是由客户端浏览器主动发送请求到服务端,然后服务器处理请求后返回结果,服务器无法主动向客户端浏览器发送消息。但是在某些业务场景下我们需要由服务器主动发送消息到客户端浏览器,如当客户用户下订单后,服务器需要主动发消息提醒商户用户有新的订单被创建,请及时处理。在这种需求下我们就需要使用到websocketWebSocket是一种在单个TCP连接上进行全双工通信的协议。...

qq_56460466的博客 1万+
lu_mc
博客等级 码龄7年 0粉丝 1原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值