websocket断开连接再创建引发的问题

苏珊大妈 发布于 2011/09/19 15:53
阅读 36K+
收藏 4
var socket;
var initWebSocket = function() {
    if (window.WebSocket) {
        if (window.WebSocket)
            socket = new WebSocket("ws://127.0.0.1:8080/websocket");
        socket.onmessage = function(event) {
            var json = JSON.parse(event.data);
            document.getElementById("message").value = json.message;
        };
        socket.onopen = function(event) {
            alert("Web Socket opened!");
        };
        socket.onclose = function(event) {
            alert("Web Socket closed.");
        };
        socket.onerror = function(event) {
            alert("Web Socket error.");
        };
    } else {
        alert("Your browser does not support Web Socket.");
    }
}
initWebSocket();

function send() {
    if (!socket || socket.readyState != 1) {
        initWebSocket();
    }
    socket.send("{'send':1,'take':2,'message':" + Math.random() + "}");
}

问题描述:第一次打开网页[或刷新] 会自动执行initWebSocket方法,与服务器通信正常,此时执行send方法socket.readyState的值为1,所

以能正常发送数据到S. S端在5分钟如果客户端没有进行通信,则会把socket关闭,如果此时客户端

再send数据调用send方法时。会先判断if (!socket || socket.readyState != 1) 会执行

initWebSocket方法,目的是重新创建一个socket连接,但此时发送数据会报错, 因为

socket.readyState的值不是1而是0。

出现这类问题的原因:浏览器第一次打开网页或刷新网页

socket.readyState的值最开始也是0, 当监听onopen执行后socket.readyState的值才会

变为1,这个过程会很快,当你再手动的去调 用send方法时因为 此时socket.readyState状态为

1了,所以能发送成功,但initWebSocket() 方法调用后马上socket.send就有问题因为onopen是

异步的,socket.send时onopen还没来得及 执行。所以。。。。

求好的解决办法,或我的理解有错


加载中
0
苏珊大妈
苏珊大妈

问题以解决,直接发代码。重点在发送数据之前的判断

var socket;
var $ = function() {
    return document.getElementById(arguments[0]);
}
var log = function(msg) {
    $("log").innerHTML ? $("log").innerHTML += "<br />" + msg : $("log").innerHTML = msg;
}
var initWebSocket = function() {
    if (window.WebSocket) {
        socket = new WebSocket("ws://127.0.0.1:8080/websocket");
        socket.onmessage = function(event) {
            var json = JSON.parse(event.data);
            document.getElementById("message").value = json.message;
        };
        socket.onopen = function(event) {
            log("Web Socket opened!");
        };
        socket.onclose = function(event) {
            log("Web Socket closed.");
        };
        socket.onerror = function(event) {
            log("Web Socket error.");
        };
    } else {
        log("Your browser does not support Web Socket.");
    }
}
var send = function() {
    var data = function() {
        socket.send("{'send':1,'take':2,'message':" + Math.random() + "}");
    };
    if (socket.readyState !== 1) {
        socket.close();
        initWebSocket();
        setTimeout(function() {
            data();
        }, 250);
    } else {
        data();
    };

}
window.onload = function() {
    initWebSocket();
}

爱coding
爱coding
问一下,这个问题怎么解决的呢?我也遇到了,服务器端过一段时间会自动断开,我隔一段时间判断 if (socket.readyState !== 1) { 33 socket.close(); 34 initWebSocket(); } socket .readyState总等于1,所以不会重新创建websocket对象,怎么解决呢?求指点。
0
opal
opal
既然是服务器端主动断开,你要在 onclose 事件中做功夫
0
爱coding
爱coding

问一下,这个问题怎么解决的呢?我也遇到了,服务器端过一段时间会自动断开,我隔一段时间判断

if (socket.readyState !== 1) {

33         socket.close();
34         initWebSocket();
}
socket .readyState总等于1,所以不会重新创建websocket对象,怎么解决呢?求指点。
0
苏珊大妈
苏珊大妈
if (socket.readyState !== 1) {
    socket.close();
    initWebSocket();
    setTimeout(function() {
        data();
    }, 250);
} else {
    data();
};
重点在这里。在每次发送数据之前先判断一下。

0
p
phil
我觉得这样不时的创建连接不太好吧,可以在server上加上keep-alive的message,client端每隔一段时间发一个keep-alive, 这样就可以了,简单方便

0
h
huaganshang
safria5.1.7下,_ws = new WebSocket("ws://10.11.81.38:7272");后,readyState一直是2;有谁遇到过么?
0
刀哥
刀哥
这样重连能保持session吗?
返回顶部
顶部