今天在nginx下调试出现了这个问题->WebSocket connection to failed: Close received after close , 原因浏览器在close 命令发送后, 没有收到服务器关闭消息之前, 服务器提前关闭这个流。 需要我们仔细看代码, 一定要把代码写在对的位置。
原因是同步的代码要比异步的提前执行。修改后的代码。
while (true) {
if (this.websocket == null) { /**关闭连接后信号退出*/
break
}
__asm__ ("local data, type, err = this.websocket:recv_frame()")
if(type == "close") {
this.decr ();
if(this.zero() && this.websocket != null) {/**关闭连接后信号退出*/
this.close(1000)
}
break
}
if(type == "ping") {
__asm__("local bytes, err = this.websocket:send_pong(data)")
if(bytes == false) {
ngx.log(ngx.ERR, "failed to send frame: ", err)
break
}
} else {
if(type == "text" && this.onmessage != null) {
this.onmessage (data);
}
}
} //---end while
另外在nginx的异步体系下, 要了解事件的生命周期,需要转换思维。
var ns = exports.createNamespace("core");
var forbid = ns.forbid();
ngx.log(ngx.ERR, "##forbid = " , forbid) ;
限制
if(!forbid){
ngx.log(ngx.ERR, "ERROR:only one client by ip..")
ngx.exit(403);
}
var server = new exports.core.ServerWebSocket ()
server.onclose = function () {
ns.release();
}
server.onmessage = function (message) {
ns.log(server, message);
//server.sendmessage(message)
}
server.start(15000, 100)