精华内容
下载资源
问答
  • 但打包完部署到linux上运行,Websocket连接特别,平均要花10秒左右才能建立连接。 框架结构 整体采用前后端分离开发: 前端:Vue.js+sockjs-client+Webstomp-client 后端:Springboot+WebStomp 关于前后端...

    问题描述

    系统在本地开发测试时Websocket连接很正常,都是秒连。但打包完部署到linux上运行,Websocket连接特别慢,平均要花10秒左右才能建立连接。

    框架结构

    整体采用前后端分离开发:
    前端:Vue.js+sockjs-client+Webstomp-client
    后端:Springboot+WebStomp

    关于前后端Websocket具体实现,可移步我的另一篇博客:
    前后端分离WebSocket +Springboot 实战详解

    过程

    排除了网络问题之后,在一步步的Debug之中,拨开了Bug的层层面纱。最终发现原来是Java原生方法InetAddress.getLocalHost()的坑~

    在websocket连接过程中,会将http协议升级为websocket协议,在升级过程中,调用了InetAddress.getLocalHost(),而这个方法的底层获取依赖于JDK原生InetAddress类的操作。
    下面是JDK中InetAddress类的描述

    • InetAddress Caching

    • The InetAddress class has a cache to store successful as well as unsuccessful host name resolutions.

    By default, when a security manager is installed, in order to protect against DNS spoofing attacks, the result of positive host name resolutions are cached forever. When a security manager is not installed, the default behavior is to cache entries for a finite (implementation dependent) period of time. The result of unsuccessful host name resolution is cached for a very short period of time (10 seconds) to improve performance.

    为了防止DNS欺骗攻击,这个类会缓存获取主机地址的结果,默认缓存10秒,也就是说如果获取失败了,10秒之内都会处于等待状态,拿不到正确的结果。

    解决方案

    在系统hosts文件中增加本地ip地址与主机名的对应项

    例如说你的ip是 10.1.4.166 主机名是centos1

    那么配置: 10.1.4.166 centos1

    展开全文
  • <p>My <a href="https://github.com/gorilla/websocket" rel="nofollow noreferrer">Gorilla WebSocket</a> and <a href="https://github.com/websockets/ws" rel="nofollow noreferrer">node-ws</a> servers below:...
  • jmeter插件websocket

    2018-06-27 14:45:42
    Jmeter中测试Websocket依赖的jar包(全) 包含JMeterWebSocketSampler-1.0.2-SNAPSHOT.jar及其依赖jar包: 1、jetty-http-9.1.2.v20140210.jar 2、jetty-io-9.1.2.v20140210.jar 3、jetty-util-9.1.2.v20140210.jar ...
  • HTTP与WebSocket比较

    千次阅读 2018-07-18 20:58:19
    1,无状态协议。 2,短连接。(Ajax轮询方式或Long poll方式实现“持久连接”状态) 2,被动型。 客户端请求-&...Websocket),服务端就可以主动推送信息给客户端啦。 就变成了这样,只...

    HTTP:

    1,无状态协议。

    2,短连接。(Ajax轮询方式或Long  poll方式实现“持久连接”状态)

    2,被动型。  客户端请求->服务器端响应。服务端不能主动联系客户端,只能有客户端发起。

    WebSocket:

    它解决了HTTP的这几个难题。
    被动性,当服务器完成协议升级后(HTTP->Websocket),服务端就可以主动推送信息给客户端啦。

    就变成了这样,只需要经过一次HTTP请求,就可以做到源源不断的信息传送了。(在程序设计中,这种设计叫做回调,即:你有信息了再来通知我,而不是我傻乎乎的每次跑来问你)
    这样的协议解决了同步有延迟,而且还非常消耗资源的这种情况。
    那么为什么他会解决服务器上消耗资源的问题呢?
    其实我们所用的程序是要经过两层代理的,即HTTP协议在Nginx等服务器的解析下,然后再传送给相应的Handler(PHP等)来处理。
    简单地说,我们有一个非常快速的接线员(Nginx),他负责把问题转交给相应的客服(Handler)
    本身接线员基本上速度是足够的,但是每次都卡在客服(Handler)了,老有客服处理速度太慢。,导致客服不够。
    Websocket就解决了这样一个难题,建立后,可以直接跟接线员建立持久连接,有信息的时候客服想办法通知接线员,然后接线员在统一转交给客户。
    这样就可以解决客服处理速度过慢的问题了。

    同时,在传统的方式上,要不断的建立,关闭HTTP协议,由于HTTP是非状态性的,每次都要重新传输identity info(鉴别信息),来告诉服务端你是谁。
    虽然接线员很快速,但是每次都要听这么一堆,效率也会有所下降的,同时还得不断把这些信息转交给客服,不但浪费客服的处理时间,而且还会在网路传输中消耗过多的流量/时间。
    但是Websocket只需要一次HTTP握手,所以说整个通讯过程是建立在一次连接/状态中,也就避免了HTTP的非状态性,服务端会一直知道你的信息,直到你关闭请求,这样就解决了接线员要反复解析HTTP协议,还要查看identity info的信息。
    同时由客户主动询问,转换为服务器(推送)有信息的时候就发送(当然客户端还是等主动发送信息过来的。。),没有信息的时候就交给接线员(Nginx),不需要占用本身速度就慢的客服(Handler)了。


    至于怎么在不支持Websocket的客户端上使用Websocket。。答案是:不能
    但是可以通过上面说的 long poll 和 ajax 轮询来 模拟出类似的效果

     

    WebSocket 机制

    以下简要介绍一下WebSocket的原理及运行机制。

    WebSocket是HTML5下一种新的协议。它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的。它与HTTP一样通过已建立的TCP连接来传输数据,但是它和HTTP最大不同是:

    • WebSocket是一种双向通信协议。在建立连接后,WebSocket服务器端和客户端都能主动向对方发送或接收数据,就像Socket一样;
    • WebSocket需要像TCP一样,先建立连接,连接成功后才能相互通信。

    传统HTTP客户端与服务器请求响应模式如下图所示:

     

     

    WebSocket模式客户端与服务器请求响应模式如下图:

     

    上图对比可以看出,相对于传统HTTP每次请求-应答都需要客户端与服务端建立连接的模式,WebSocket是类似Socket的TCP长连接通讯模式。一旦WebSocket连接建立后,后续数据都以帧序列的形式传输。在客户端断开WebSocket连接或Server端中断连接前,不需要客户端和服务端重新发起连接请求。在海量并发及客户端与服务器交互负载流量大的情况下,极大的节省了网络带宽资源的消耗,有明显的性能优势,且客户端发送和接受消息是在同一个持久连接上发起,实时性优势明显。

    相比HTTP长连接,WebSocket有以下特点:

    • 是真正的全双工方式,建立连接后客户端与服务器端是完全平等的,可以互相主动请求。而HTTP长连接基于HTTP,是传统的客户端对服务器发起请求的模式。
    • HTTP长连接中,每次数据交换除了真正的数据部分外,服务器和客户端还要大量交换HTTP header,信息交换效率很低。Websocket协议通过第一个request建立了TCP连接之后,之后交换的数据都不需要发送 HTTP header就能交换数据,这显然和原有的HTTP协议有区别所以它需要对服务器和客户端都进行升级才能实现(主流浏览器都已支持HTML5)。此外还有 multiplexing、不同的URL可以复用同一个WebSocket连接等功能。这些都是HTTP长连接不能做到的。

    下面再通过客户端和服务端交互的报文对比WebSocket通讯与传统HTTP的不同点:

    在客户端,new WebSocket实例化一个新的WebSocket客户端对象,请求类似 ws://yourdomain:port/path 的服务端WebSocket URL,客户端WebSocket对象会自动解析并识别为WebSocket请求,并连接服务端端口,执行双方握手过程,客户端发送数据格式类似:

    GET /webfin/websocket/ HTTP/1.1
    Host: localhost
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg==
    Origin: http://localhost:8080
    Sec-WebSocket-Version: 13
    

    可以看到,客户端发起的WebSocket连接报文类似传统HTTP报文,Upgrade:websocket参数值表明这是WebSocket类型请求,Sec-WebSocket-Key是WebSocket客户端发送的一个 base64编码的密文,要求服务端必须返回一个对应加密的Sec-WebSocket-Accept应答,否则客户端会抛出Error during WebSocket handshake错误,并关闭连接。

    服务端收到报文后返回的数据格式类似:

    HTTP/1.1 101 Switching Protocols
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Accept: K7DJLdLooIwIG/MOpvWFB3y3FE8=
    

    Sec-WebSocket-Accept的值是服务端采用与客户端一致的密钥计算出来后返回客户端的,HTTP/1.1 101 Switching Protocols表示服务端接受WebSocket协议的客户端连接,经过这样的请求-响应处理后,两端的WebSocket连接握手成功, 后续就可以进行TCP通讯了。用户可以查阅WebSocket协议栈了解WebSocket客户端和服务端更详细的交互数据格式。

    在开发方面,WebSocket API 也十分简单:只需要实例化 WebSocket,创建连接,然后服务端和客户端就可以相互发送和响应消息。

     

    展开全文
  • nginx 代理websocket问题排查

    千次阅读 2019-08-23 11:04:18
    1. 使用curl测试websocket服务是否能正常连入 可根据参考资料[1][2]中的内容来完成,对于https连接: curl --include --no-buffer --header "Connection: Upgrade" --header "Upgrade: websocket" --header "Host: ...

    1. 使用curl测试websocket服务是否能正常连入

    可根据参考资料[1][2]中的内容来完成,对于https连接:

    curl --include --no-buffer --header "Connection: Upgrade" --header "Upgrade: websocket"  --header "Host: xxx.xxx.com"  --header "Origin: https://xxx.xxx.com"  --header "Sec-WebSocket-Key: SGVsbG8sIHdvcmxkIQ=="  --header "Sec-WebSocket-Version: 13" https://xxx.xxx.com/pushsrv
    

    若可正常连接,可返回如下信息:
    在这里插入图片描述
    在这里插入图片描述
    若不正常,则有如下信息返回:
    在这里插入图片描述
    且不后台也有如下报错信息:在这里插入图片描述

    2. 通过nginx反向代理websocket问题分析

    实际是通过nginx反向代理了websocket连接,参照参考资料[3],需在nginx中的default.conf中增加如下配置信息:

    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    

    3. nginx代理的情况分析

    可在nginx.conf中增加log信息分析:

    log_format  main  '$time_iso8601 $http_x_forwarded_for $remote_addr "$request" $status $content_length $content_type $request_body $body_bytes_sent "$http_referer" "$http_user_agent" "$proxy_add_x_forwarded_for" @@"$http_accept_encoding"';
    

    default.conf中对应配置与上面main相应的名称。
    在这里插入图片描述

    参考资料:
    [1] https://blog.csdn.net/sd2131512/article/details/74996577
    [2] https://gist.github.com/htp/fbce19069187ec1cc486b594104f01d0
    [3] http://nginx.org/en/docs/http/websocket.html

    展开全文
  • 连接本地websocket服务延迟的问题

    千次阅读 2017-06-12 23:18:00
    今天用C#编写了一个Chrome Remote Debugger的客户端程序,发现使用rest和websocket程序时第一次连接的时候特别,大概每次都要消耗一秒左右,而用chrome直接连接却没有这种情况。 由于后续编写蜘蛛时也经常要调试...

    今天用C#编写了一个Chrome Remote Debugger的客户端程序,发现使用rest和websocket程序时第一次连接的时候特别慢,大概每次都要消耗一秒左右,而用chrome直接连接却没有这种情况。

    由于后续编写蜘蛛时也经常要调试,每次多消耗两秒觉得开销有点大,便准备着手解决它。

    最开始以为是webproxy的问题,后来查看了一下,确实没有代理。便用Fiddler模拟了一下rest请求试了一下,它也需要一秒左右。便对比了一下chrome和fiddler的请求包,发现Request的Url有所不同:

    于是便将程序中的请求也改成了127.0.0.1,我的程序便也变快了。

    解决了问题后,回头来再分析一下原因,最开始以为是我的dns解析出问题了,试了一下,解析localhost是很快的,地址也是正常的。于是我便自己写了一个websocket server自己尝试连接了一下试试,发现出现了同样的现象:服务器和客户端一个使用localhost,一个使用127.0.0.1的时候,就会出现一秒左右的连接延迟,一致的时候就是正常的

    看来这个并不是Server端Chrome的问题,解决方式也知道了。至于是不是协议规定的,目前还没有时间详细研究,后续有空再继续研究一下。

    展开全文
  • tomcat中关于websocket的性能优化配置

    千次阅读 2017-05-23 15:14:08
    org.apache.tomcat.websocket.executorKeepAliveTimeSeconds:executor线程池中空闲进程所保留的最大时间。如果未指定,则默认为60秒。 设置方法: web.xml中 <!--websocket executor 线程池的核心容量大小 --...
  • 这里的事情进展得很,因为我目前还有很多其他事情要处理,所以如果我没有回答你的问题或者 PR 有几天或几周没有审核,请不要生气。 任何有兴趣帮助它更快地发展的人都可以通过提交或审查 PR 并回答彼此的问题来...
  • 我们这里是WebSocket客户端,对方是WebSocket服务端。当客户端连接到服务端后,发送相应的参数到服务端,服务端就会往客户端返回数据。 问题描述: 当服务端不停的往回返回数据时,且每次返回的数据量都很大时,造成...
  • Jmeter的WebSocket协议支持插件: JMeterWebSocketSampler-1.0.2-SNAPSHOT.jar 所需依赖包: 1、jetty-http-9.1.2.v20140210.jar 2、jetty-io-9.1.2.v20140210.jar 3、jetty-util-9.1.2.v20140210.jar 4、websocket-...
  • 微信小程序webSocket的设置

    万次阅读 2017-02-24 09:21:18
    小程序发布一个多月了,慢慢的也摸索的差不多了,今天加了一个webSocket,遇到点坑,写来分享下,水平有限。 小程序最大的优点就是给的东西很全,缺点也是有些封闭了, 关于websocket的设置,API里边已经给了, wx...
  • websocket 爬虫

    千次阅读 2018-08-08 13:05:28
    有些网站为了追求数据的实时更新,很多时候会采用 websocket 的方式,例如股票交易数据、数据货币交易平台等。关于websocket的机制,网上不乏相关资料。但关于websocket的爬虫文章,还是比较少的。所以特地写此文章...
  • Android中使用WebSocketClient进行WSS请求需要的jar包,Java-WebSocket-1.3.1-SNAPSHOT.jar,Java-WebSocket-1.3.1.jar
  • 从而让内存不足,会导致信号变弱,因此我们会感觉到网速越来越,而关闭路由器可以将这些缓存释放,让内存空间空出来,这样你就不会感到网速了,因此正确的做法是定期关闭路由器。在通常情况下可以通过路由器内部...
  • 一、WebSocket协议 WebSocket是HTML5下一种新的协议。 它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的。 它与HTTP一样通过已建立的TCP连接来传输数据,但是它和HTTP...
  • 一、C#服务端webSocket的异步请求超时处理
  • WebSocket

    2019-04-13 10:05:44
    今日发现项目中包含websocket相关代码,但之前没有接触过 ,在搜索了之后发现这片解释得最平常话,也最好理解。于是转载,供websocket学习使用。 一、websocket与http WebSocket是HTML5出的东西(协议),也就是说...
  • 解决IIS服务器访问速度变问题

    万次阅读 2018-06-06 09:51:20
    最近发现公司网站变打开速度奇,登陆了远程桌面也是卡得飞起,于是我找个时间重启了一次服务器,结果网站加载速度变回正常。当我以为一切已经解决了的时候,过了几天,网站打开速度变了。 服务器变卡,可能的...
  • 公司项目有个需求,将发生的事件使用webSocket推送到前端(包括一张高清图),要求1秒之内在web上显示,且不能失真。 方案1:首先是将图片转换成base64,作为字符串推送给前端,但是推送过来的信息量太大,导致接收...
  • WebSocket服务器 WebSocket标准的一致服务器实现,作为PureBasic的模块。 特征: 支持未分段和分段的二进制和文本框架... 使用此WebSocket服务器的更简单(但更)的方法是轮询事件。 即使服务器在内部使用线程,也
  • websocket

    2018-07-30 23:00:20
    WebSocket是一种在单个TCP连接上进行全双工通讯的协议。&amp;amp;nbsp; ok,既然是双向通信,我相信你们一定玩过轮询,好吧,没玩过的看下面: 轮询(polling):客户端按规定时间定时像服务端发送ajax请求,...
  • websocket与http,轻松理解websocket

    万次阅读 2018-07-18 15:28:52
    一、websocket与http WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算) 首先HTTP有 1.1 和 1.0 之说,也就是所谓的 keep-...
  • 重新定义网络编程模式,让天下没有难写的网络...tio-websocket-server tio-http-server tio-udp-server 4、t-io 应用场景-图示 4、t-io 应用场景-文字描述 t-io 是基于 JVM 的网络编程框架,和 netty 属同类,所以
  • 如何测试websocket接口

    万次阅读 2020-05-11 15:48:21
    1.websocket简介 websocket 是一种双向通信协议,在建立连接后,websocket服务端和客户端都能主动向对方发送或者接收数据,而在http协议中,一个request只能有一个response,而且这个response也是被动的,不能主动...
  • uniapp使用websocket

    2021-07-02 17:37:15
    //连接socket var socket = uni.connectSocket({ url: 'ws://127.0.0.1:2346', //...// websocket正常... socket.onOpen((res) => { console.log('websocket正常...'); this.socket.send({ // 发送消息 data:
  • 一、WebSocket是HTML5中的协议,支持持久连接;...WebSocket是HTML5中新协议、新API.Http协议本身只有1.0和1.1,也就是所谓...二、WebSocket是什么样的协议,具体有什么优点。首先,相对于Http这种非持久的协议来说,WebS
  • 进行收发数据(*为websocket特有协议) - 客户端 ws = new WebSocket("ws://127.0.0.1:8002"); // 创建连接 ws.onopen = function () { //客户端发送消息 }; ws.onmessage = function (event) { //客户端接收消息 }; ...
  • websocket 实现长连接原理

    万次阅读 多人点赞 2019-02-21 21:18:24
    一、WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算)首先HTTP有1.1和1.0之说,也就是所谓的keep-alive,把多个HTTP请求合并为一个...
  • websocket_黑客websocket

    2020-09-14 00:51:39
    当应用程序不断进行这种类型的更新时,这种传统方法会导致大量不必要的开销,并最终使应用程序变。 Whereas the WebSocket protocol solves this problem by creating a persistent connection between the ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,370
精华内容 4,148
关键字:

websocket慢