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 处理程序?的主要内容,如果未能解决你的问题,请参考以下文章