精华内容
下载资源
问答
  • webSocket如何解决自动关闭的意思

    万次阅读 2018-06-30 10:37:01
    我的前一篇文章“webSocket如何在自己的工程中使用?...本文主要是解决webSocket自动关闭。websocket它有一个“心跳”机制,但这个心跳机制是要程序自己去写代码实现的,websocket本身没有给你做这个...

    我的前一篇文章“webSocket如何在自己的工程中使用?

    地址:https://blog.csdn.net/jintingbo/article/details/80755636

    讲述了webSocket的初级使用,初学者可以先看看那篇文章。

    本文主要是解决webSocket自动关闭。

    websocket它有一个“心跳”机制,但这个心跳机制是要程序自己去写代码实现的,websocket本身没有给你做这个东西。

    它是如何自动关闭的呢?当电脑浏览器发送pong帧的时候,由于内容为空,于是服务器将空内容转发回去,导致客户端浏览器以为是错误的帧类型,发送关闭信息进行error关闭。(服务器返回时,必须要把它原来发来的东西发回去的,这是TCP/IP协议的要求)。

    即然服务器接收到浏览器发送的"pong"后如果回复一个“pong”时,它会结束连接,那么为了避免这种事发生,可以在服务器接收到一个“pong”空信息时,不回复它的"pong",也就不关闭连接了。这是一种解决方案。

    另一种解决方案是:当发生关闭时,可以主动发送心跳给对方,让连接复活,这样就相当于不断线了。本文就是用这个方案实现的。

    第一步:在html文件中加入:
    -----------------------------

    <script type="text/javascript">
    var ws;
    //避免重复连接
    var lockReconnect = false;
    var wsUrl = "ws://localhost:8080/cl-market-camera-web/websocket";
    createWebSocket(wsUrl);
    function createWebSocket(url) {
    try {
    ws = new WebSocket(url);
    initEventHandle();
    } catch (e) {
                            //重新连接
    reconnect(url);
    }
    }
            //封装websocket的那几个接口函数
    function initEventHandle() {
    ws.onclose = function () {
    console.info("连接关闭");
    reconnect(wsUrl);
    };
    ws.onerror = function () {
    console.info("传输异常");
    reconnect(wsUrl);
    };
    ws.onopen = function () {
    //心跳检测重置
    heartCheck.reset().start();
    };

    websocket.onmessage = function(event) {
                        //console.info(event.data);

                        setMessageInnerHTML(event.data);
                        //如果获取到消息,心跳检测重置
                        heartCheck.reset().start();
    }
    }
    function reconnect(url) {
    if(lockReconnect) return;
    lockReconnect = true;
    //没连接上会一直重连,设置延迟避免请求过多
    setTimeout(function () {
        console.info("尝试重连..." + new Date().format("yyyy-MM-dd hh:mm:ss"));
        createWebSocket(url);
        lockReconnect = false;
    }, 5000);
    }
    //心跳检测,每5s心跳一次
    var heartCheck = {
    timeout: 5000,
    timeoutObj: null,
    serverTimeoutObj: null,
    reset: function(){
        clearTimeout(this.timeoutObj);
        clearTimeout(this.serverTimeoutObj);
        return this;
            },
    start: function(){
        var self = this;
        this.timeoutObj = setTimeout(function(){
            //这里发送一个心跳,后端收到后,返回一个心跳消息,
            //onmessage拿到返回的心跳就说明连接正常
            ws.send("HeartBeat" + new Date().format("yyyy-MM-dd hh:mm:ss"));
                    console.info("客户端发送心跳:" + new Date().format("yyyy-MM-dd hh:mm:ss"));

                    self.serverTimeoutObj = setTimeout(function(){
                                //如果超过一定时间还没重置,说明后端主动断开了

                                ws.close();
                                //如果onclose会执行reconnect,我们执行ws.close()就行了.
                                //如果直接执行reconnect 会触发onclose导致重连两次
                            }, self.timeout)
                        }, this.timeout)
                    }
    }
    //js中格式化日期,调用的时候直接:new Date().format("yyyy-MM-dd hh:mm:ss")
    Date.prototype.format = function(fmt) {
    var o = {
        "M+" : this.getMonth()+1,                 //月份 
        "d+" : this.getDate(),                    //日 
        "h+" : this.getHours(),                   //小时 
        "m+" : this.getMinutes(),                 //分 
        "s+" : this.getSeconds(),                 //秒 
        "q+" : Math.floor((this.getMonth()+3)/3), //季度
        "S"  : this.getMilliseconds()             //毫秒 
            }; 
            if(/(y+)/.test(fmt)) {

        fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length)); 

                    }

            for(var k in o) {
        if(new RegExp("("+ k +")").test(fmt)){
            fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
                }
                    }
            return fmt; 
            }
    function setMessageInnerHTML(innerHTML) {
    document.getElementById('message').innerHTML += innerHTML + '<br/>';
    }
    </script>

    第二步:在java的controller包中写一个WebSocketTest类
    ------------------------------
    package com.clmarket.controller;
    import javax.websocket.*;
    import javax.websocket.server.ServerEndpoint;
    import java.io.IOException;
    import java.util.concurrent.CopyOnWriteArraySet;

    @ServerEndpoint("/websocket")
    public class WebSocketTest {
            //设置连接数
    private static int onlineCount = 0;
    private static CopyOnWriteArraySet<WebSocketTest> webSocketSet = 
    new CopyOnWriteArraySet<WebSocketTest>();
    private Session session;
    public Session getSession(){
    return this.session;
    }
    @OnOpen
    public void onOpen(Session session){
    this.session = session;
    webSocketSet.add(this);     //加入set中
    addOnlineCount();           //在线数加1
    System.out.println("有新连接加入!当前在线人数为" + getOnlineCount());
    }
    @OnClose
    public void onClose(){
    webSocketSet.remove(this);  //从set中删除
    subOnlineCount();           //在线数减1
    System.out.println("有一连接关闭!当前在线人数为" + getOnlineCount());
    }
    /**
    * 服务器向浏览器发送消息
    * @param message 需要推送到浏览器的消息
    * @param session 可选的参数
    */
    @OnMessage
    public void onMessage(String message, Session session) {
    for(WebSocketTest item: webSocketSet){
    try {
    item.sendMessage(message);
    } catch (IOException e) {
    e.printStackTrace();
    continue;
    }
    }
    }

    /**
    * 发生错误时调用
    * @param session
    * @param error
    */
    @OnError
    public void onError(Session session, Throwable error){
    System.out.println("发生错误");
    error.printStackTrace();
    }
    /**
    * 这个方法与上面几个方法不一样。没有用注解,是根据自己需要添加的方法。
    * @param message
    * @throws IOException
    */
    public void sendMessage(String message) throws IOException{
    this.session.getBasicRemote().sendText(message);
    //this.session.getAsyncRemote().sendText(message);
    }
    public static synchronized int getOnlineCount() {
    return onlineCount;
    }

    public static synchronized void addOnlineCount() {
    WebSocketTest.onlineCount++;
    }

    public static synchronized void subOnlineCount() {
    WebSocketTest.onlineCount--;
    }

    }

    第三步:如何把自己的信息借助上面的WebSocketTest类推送出去
    -----------------------------

    比如服务器有一个字符串“鄂H AAAAA8”这样的字符串,要把它推到浏览器里显示出来,

    其实只要三句话搞定:


    String license=“鄂H AAAAA8”;

    //new一个WebSocketTest对象,表示我要用它来发送
    WebSocketTest wst=new WebSocketTest();
    //这个session实际上是import javax.websocket.Session;
    Session session=wst.getSession();
    //调用这个webSocketTest对象的onMessage就可以把license发送出去了。
    wst.onMessage(license, session);

    全文完:湖北荆门金庭波 QQ:14280784 

    展开全文
  • websocket自动断开连接问题

    万次阅读 多人点赞 2016-09-23 13:28:58
    问题:每过5分钟左右,websocket就会自动关闭 原因:使用了nginx服务,nginx配置: proxy_read_timeout(Default: 60s;),如果一直没有数据传输,连接会在过了这个时间之后自动关闭 ...Defines

    问题:每过5分钟左右,websocket就会自动关闭

    原因:使用了nginx服务,nginx配置:
    proxy_read_timeout(Default: 60s;),如果一直没有数据传输,连接会在过了这个时间之后自动关闭
    参考:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_read_timeout
    Defines a timeout for reading a response from the proxied server. The timeout is set only between two successive read operations, 
    not for the transmission of the whole response. If the proxied server does not transmit anything within this time, the connection is closed.


    可以通过心跳保持连接
    参考:http://nginx.org/en/docs/http/websocket.html
    the proxied server can be configured to periodically send WebSocket ping frames to reset the timeout and check if the connection is still alive.


    在js中使用websocket发送信息之前,判断websocket对象是不是打开的,如果不是则重新构造/连接

    展开全文
  • 时间到期后后台自动关闭。 怎么关闭呢 2、由于业务需求,在一些特定的情况。我需要用java来关闭长链接。怎么来实现呢。 我不想前端调用onclose事件来触发关闭。希望在后台关闭。前端也会得到通知
  • ConnectionResetError(10054,'远程主机强迫关闭了一个现有的连接。',None,10054, None)非常奇怪,因为脚本之前运行都没有问题的,重新启动IDE无效,更新新版IDE无效。想着这肯定是连接服务的地...

    最近在使用Airtest这套框架尝试web自动化界面测试的时候,在脚本之前都可正常运行的情况下,偶有的时候遇到连接错误,报错:Connection abourted. ConnectionResetError(10054,'远程主机强迫关闭了一个现有的连接。',None,10054, None)

    80d4e74487ef5cca429815f13cd6ad47.png

    非常奇怪,因为脚本之前运行都没有问题的,重新启动IDE无效,更新新版IDE无效。想着这肯定是连接服务的地方出问题了,后来排查过后发现是chromedriver版本不匹配导致的。

    是由于chrome自动更新了,chromedriver还是旧的,chrome浏览器的chromedriver版本不一致,所以需要手动更新一下:

    https://chromedriver.storage.googleapis.com/index.htmlchromedriver.storage.googleapis.com

    0dda37aaa5f7ce5b7397b87d838e69ff.png

    网上已经有人整理过chrome各版本对应的chromedriver版本可供参照的。

    chromedriver与chrome对应各版本及下载地址:https://blog.csdn.net/cz9025/article/details/70160273

    找到对应的chromedriver版本下载更新到IDE解压的目录下替换掉chromedriver即可。

    替换前最好先备份一下旧版,这是个良好的习惯。替换后关闭浏览器重新启动AirtestIDE,运行脚本,过了。

    可是,隔了几天再次运行脚本的时候,发现又报错了。同样是浏览器连接相关的问题,但这次错误是:WebDriverEexception:unknown error: DevToolsActivePort file dosen't exist. 下面还打印了Chrome Driver info,猜测估计还是chrome driver驱动的问题了。

    0ea7f44266b8c736770a270267838790.png

    查看当前chromedriver的版本跟当前chrome浏览器的版本其实相差不大,都是70.0xxx ,但是尾数不一样,但既然有最新的就还是下载最新的chromedriver 71.xx 试试了,替换后再运行脚本就成功了!

    展开全文
  • 记一次websocket自动断开连接

    千次阅读 2019-03-14 01:29:46
    websocket与后台连接用着用着就自动断开了: 原因分析: 1.首先再websocket关闭回调中添加日志,观察输出日志 ws.onclose = function (e) { console.log('websocket 断开:' + e.code + ' ' + e.reason + ' ' +...

    websocket与后台连接用着用着就自动断开了:

    原因分析:

    • 1.首先再websocket的关闭回调中添加日志,观察输出日志
    ws.onclose = function (e) {
        console.log('websocket 断开:' + e.code + ' ' + e.reason + ' ' + e.wasClean)
        console.log(e)
    }
    复制代码

    CloseEvent.code:错误码
    CloseEvent.reason: 断开原因
    CloseEvent.WasClean: 是否正常断开

    关闭状态码表

    状态码 名称 描述
    0-999 保留字段
    1000 CLOSE_NORMAL 正常关闭
    1001 CLOSE_GOING_AWAY 终端离开,服务器端错误,也有可能是浏览器从页面跳转离开
    1002 CLOSE_PROTOCOL_ERROR 由于协议错误而终端连接
    ……
    • 2.观察原因得出是1000,正常断开连接。多次测试发现,原来是因为点击了页面的下载功能后,webscoket就自动断开连接。必现
    • 3.查看下载功能的代码,发现是:
    <a style='color:#a0b883;text-decoration:underline;cursor:pointer;' 
    download= '错误日志.xlsx'
    href = 'http://ip:port/group1/M00/03/8C/CsQVW1yI1wqAVLDZAAAruXJmym45.xlsx'>错误日志下载</a>
    复制代码
    • 4.根据上述a标签发现,原来是因为a标签下载导致页面离开了。

    解决办法:

    给a标签加上target属性就可以解决。
    
    <a target='_blank' 
     style='color:#a0b883;text-decoration:underline;cursor:pointer;' 
     download= '错误日志.xlsx' 
     href = 'http://ip:port/group1/M00/03/8C/CsQVW1yI1wqAVLDZAAAruXJmym45.xlsx'>错误日志下载</a>
    复制代码

    转载于:https://juejin.im/post/5c89a718f265da2db66e1a9d

    展开全文
  • 如果是选中的图片,则内容html是图片的二进制,并且还比较长,websocket自动关闭了,提示错误是:**发送内容太长**? 有大神做过没有呢,请指教!!!!! 其他的都还好,就是内容太长,websocket连接会被强制...
  • <div><p>WebSocketServer示例,为什么每次客户端连接1分钟服务端就自动关闭这个客户端的连接了?websocket server要如何保持一直和这个客户端连接?</p><p>该提问来源于开源项目:kerryjiang/SuperSocket</p></...
  •  java 后台没有报错,但是就是连接不上,一连上又自动关闭。 2 错误根源:  缺少jar包。  对比了报错的tomcat 的jar包和不报错的jar包  发现是tomcat下缺少上图绿色框中的两个jar包。 3 解决方案:  刚...
  • 前端页面作为消费者,监听的是rabbitmq中的一个交换机,由此来订阅消息,原生websocket因为无法实现监听了很好数据传输,所以采用stomp来更好创建socket,但是websocket经历一段时间会自动断开,但是这里很多说采用...
  • 由于websocket连接成功过段时间自动关闭,无法继续获取消息 于是我就想到一个办法,就是自动关闭时再重新创建一次(因为自动关闭也不是很快就关闭的,所以我就这么写),虽然实现方式不是很好,但是也暂时的实现了长...
  • WebSocket 实时推送消息

    2021-01-15 13:42:06
    2.前端自动关闭或者主动关闭都不影响下次正常上线推送 在线客户端:http://www.websocket-test.com/ 中间需要推送的数据存储到redis中了,因项目的不同可以做相对于的调整。 3.定时异步操作 后台通信处理,...
  • SpringBoot+WebSocket+Redis 实现消息推送

    千次阅读 2020-01-15 17:37:27
    环境: SpringBoot 2.0.0.3 + JDK 1.8 + IDEA + Redis(spring-boot-starter-data-redis) + Nginx1.14 坑点: 程序以war包运行。websocket配置问题 ... websocket短时间 自动关闭。 redis消息发布/订阅模式发...
  • 最近用java websocket开发的客户端程序,在和服务端链接通后,在数据传输完毕后,客户端自动关闭了链接,如何能保持链接不断开 这个是客户端的启动类,在循环完毕后,会自动断开和服务器的链接,开始怀疑是session...
  • WebSocket连接后一分钟会自动断开关闭 这是因为websocket长连接有默认的超时时间1分钟,就是超过一定的时间没有发送任何消息,连接会自动断开。 此时:我们需要发送心跳包来解决此问题, 我这边是做了5秒发送一次的...
  • spring-boot-starter-websocket入门

    千次阅读 2018-12-28 10:09:39
    也有可能因为websocket打开过久自动关闭它 所以Spring Framework提供了基于SockJS协议的透明后备方案。 这些方案可以通过配置启用,不需要修改应用程序;  2 Spring Framework 4 包括一个新的spring-messaging 模块...
  • 小程序 websocket连接

    千次阅读 2018-07-31 19:11:16
    最近小程序用到了长连接事件,所以封装了一套基本的socket连接 其中有几点需要注意 1、必须要有心跳,如果没有会自动断开...4、如果在还没连接成功时退出连接,会导致无法关闭,所以添加了socketClose来关闭sock...
  • 关于websocket断开连接的一些猜想

    千次阅读 2015-09-16 00:03:25
    前段时间由于工作需要,自己使用websocket编写了一个简单的IM功能,刚开始测试时,简单的测试了功能,都可以满足要求,后来发现通信不是很稳定。 后来专门花时间测试,最终发现是服务器那边对连接有个默认超时释放的...
  • Console.log('WebSocket已经关闭。'); }; ; height:240px; overflow-y:auto;border:1px solid #333;" id="show"> 输入聊天内容"/> 发送" id="sendBn" name="sendBn"/> ``` ``` //实现的Java类 package ...
  • Vue+WebSocket 实现页面实时刷新...注意:页面刷新长连接会被关闭,其实进入当前页面建立长连接的目的就是页面不用F5刷新,所有数据自动实时刷新,如果还是来回F5大刷页面那就没有意义了。。。 <template> <d
  • 最近自己在做一个包含聊天功能的项目,其中用到的Vue+webscocket,遇到了好多...断线在监听里面,然后关闭当前webSocket进程后再去请求创建新的ws进程; this.socket.onclose = function(e){ let logout ...
  • 欢迎大家来到Altaba的博客 2017年11月27日 ...本人前端开发遇到这样的问题:websocket部分使用了nginx服务,默认配置是60s,就是60s,如果一直没有数据传输,连接会在过了这个时间之后自动关闭。 解
  • 最近vue项目要做数据实时刷新,折线图每秒重画一次,数据...注意:页面刷新长连接会被关闭,其实进入当前页面建立长连接的目的就是页面不用F5刷新,所有数据自动实时刷新,如果还是来回F5大刷页面那就没有意义了。。...
  • 没有自动升级 <h3>ENV <p>OS Platform: win10_64 Node.js Version: 6.11.2 ThinkJS Version: 3.2.4 think-websocket Version: 1.0.6 think-websocket-socket.io Version: 1.0.5 问题描述 我配置了socketio之后࿰...
  • 此工具提供了一个完全自动化的系统,可以将本地的防暴API永久镜像到本地。 它使用许多微服务将在不同进程之间对不同端点的请求拆分。 该设置适用于使用大量匹配数据而又不想设置自己的数据轮询的任务。 遮光罩...
  • 但是同时FIS也就 关闭</strong> 了自动编译与自动刷新功能。 2. livereload server默认使用8132端口,因此如果端口被占用,系统会报错 <pre><code> bash Error: LiveReload server Listening failed: ...

空空如也

空空如也

1 2 3 4
收藏数 61
精华内容 24
关键字:

websocket自动关闭了