WebSocket:调用 close() 不会触发 onclose 处理程序?

Posted

技术标签:

【中文标题】WebSocket:调用 close() 不会触发 onclose 处理程序?【英文标题】:WebSocket: call close() won't trigger onclose handler? 【发布时间】:2018-02-05 09:46:40 【问题描述】:

我正在阅读 Andrew Lombardi 的书《WebSocket》, 它说

您可以通过执行手动触发调用 onclose 事件 在 WebSocket 对象上剪切 close() 方法,

第 15 页

但是当我调用 close() 方法时,它并没有触发 onclose 事件...

在 Chrome 上: 当调用close()时,服务器停止发送帧,几秒钟后(6-7 seconds maybe),我的onclose处理程序被调用。

在 iOS 11 上: 当调用close() 时,服务器停止发送帧,但从未调用过 onclose 处理程序。

那么,websocket 关闭事件的真相是什么?

我在 React 中的演示应用代码

import React,  Component  from 'react'
class App extends Component 
  constructor(props) 
    super(props)
    this.state = 
      log: [],
    
    this.ws = null
  

  render() 
    return (
      <div>
        <button type="button" onClick=this._open>
          open
        </button>
        <button type="button" onClick=this._close>
          close
        </button>

        <div
          style=
            padding: 10,
            backgroundColor: '#ddd'
          
        >
          this.state.log.map((item, index) => 
            return <div key=index>item</div>
          )
        </div>
      </div>
    )
  

  _open = () => 
    this.ws = new WebSocket('wss://cmb.100jc.net/answer/ws')
    this.ws.onopen = () => 
      alert('open')
      this.setState(prevState => 
        return 
          log: prevState.log.concat('open')
        
      )
    
    this.ws.onclose = () => 
      alert('close')
      this.setState(prevState => 
        return 
          log: prevState.log.concat('close')
        
      )
    
    this.ws.onerror = () => 
      this.setState(prevState => 
        return 
          log: prevState.log.concat('error')
        
      )
    
  

  _close = () => 
    this.ws.close()
  


export default App

【问题讨论】:

找到解决方案了吗? 当,没有@BadhanGanesh 【参考方案1】:

close() 方法尝试正常关闭 websocket。它在实际关闭套接字之前等待closeTimeout 秒(默认为 30 秒),在此期间其他对等方可以打磨关闭帧。在这段时间之后,套接字关闭并发出事件。您可以在this great stack overflow answer 中阅读更多相关信息。

【讨论】:

以上是关于WebSocket:调用 close() 不会触发 onclose 处理程序?的主要内容,如果未能解决你的问题,请参考以下文章

调用 WebSocket.close 时现有等待会发生啥

Python 服务器 - 处理 WebSocket.close()

websocket.close() 函数继续运行后

使用WebSocket实现聊天室

使用WebSocket实现聊天室

Rails WebSocket 客户端永远不会触发 OnOpen