nginx关闭websocket

原创
2018/06/11 01:24
阅读数 2.9K

今天在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)

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部