如果 chrome window 正在关闭以将缓冲区刷新为 0,如何关闭 websocket
how to close a websocket like if chrome window was closing to flush the buffer to 0
当使用 portfowarding 时,websocket 通过互联网传递并且仅在连接关闭时发送(在我的网络上就是这样),我首先尝试通过关闭 chrome(有效)来关闭 websocket,所以现在我发现终止我认为可以做与关闭网络浏览器相同的事情,但它仅适用于具有此功能的服务器并且
问题是关闭的缓冲区不是0而是13...
所以我怎样才能用 ws.terminate
或其他东西做一个 hard close
来将缓冲区刷新到 0 和一个基本代码,比如没有有错误?
ws = new WebSocket("ws://adress:5677/"),
messages = document.createElement('ul');
ws.onopen = function (event) {
alert("connect");
var lol = document.getElementById('lolz').value;
alert(lol);
ws.send(lol+" <p>\b\n\r");
ws.close();
console.log(ws.readyState);
if(ws.readyState ==2){
alert("ws.terminate");
return ws.terminate();
}
}
如果您查看图片和代码,您可以看到我使用了ws.close
,但它似乎没有做某事缓冲区未为零并且它仍然连接这是什么的图片ws.close() 之后 Websocket 的状态,我认为 ws.close() 等待服务器也关闭连接,当服务器在关闭服务器之前等待接收某些东西时,这是一个错误。
我的 pthon 服务器如果从来没有
async def Time(websocket, path):
try:
a=await websocket.recv()
print("final receive:"+str(a)+"/")
a=str(a).split("<p>")
a=a[0]
print("/"+str(a)+"/")
except:
print("erreur")
finally:
socketout(bytes(a.encode("utf-8")))
print("loop stop")
loop.stop()
print("loop ad stop")
start_server = websockets.serve(Time, "", 5678)
loop3=asyncio.get_event_loop()
loop3.run_until_complete(start_server)
视觉解释
感谢您的帮助
[![视觉][2]][2]
简短版本:因为 WebSocket
对象没有任何 terminate
方法。
close
方法(您正在调用的)足以关闭 websocket。您是从哪里了解到 terminate
方法的?
因为在你的问题中你在谈论 "hard close" 并且在你的代码中你正在做这个检查 ws.readyState == 2
我认为你正在寻找一些东西 ws.readyState == 3
.
调用 close
方法后稍等片刻即可。
onclose
属性 可以帮到你;尝试在脚本末尾添加以下行
ws.onclose = function(event) {
console.log("Socket hard closed", ws.readyState);
}
希望这对您有所帮助。
您尝试使用的 terminate
方法来自 WebSocket 的 服务器 实现(不是浏览器)。
如果担心close
方法没有真正关闭连接,可以自行验证。
在浏览器的控制台中,输入 let socket = new WebSocket("wss://javascript.info/article/websocket/demo/hello");
现在在 Shell 中输入 ping javascript.info
,这将为您提供远程 IPv6:2606:4700:20::681a:c11
.
现在输入 netstat -an -p tcpv6
应该会显示如下内容:
最后,在浏览器的控制台中输入 socket.close();
并再次输入 运行 netstat -an -p tcpv6
,您会注意到上一行已经消失了。
此外,您会注意到该行仍显示在浏览器的“网络”选项卡中:
所以在对套接字的状态进行假设时不要依赖它。
当使用 portfowarding 时,websocket 通过互联网传递并且仅在连接关闭时发送(在我的网络上就是这样),我首先尝试通过关闭 chrome(有效)来关闭 websocket,所以现在我发现终止我认为可以做与关闭网络浏览器相同的事情,但它仅适用于具有此功能的服务器并且
问题是关闭的缓冲区不是0而是13...
所以我怎样才能用 ws.terminate
或其他东西做一个 hard close
来将缓冲区刷新到 0 和一个基本代码,比如没有有错误?
ws = new WebSocket("ws://adress:5677/"),
messages = document.createElement('ul');
ws.onopen = function (event) {
alert("connect");
var lol = document.getElementById('lolz').value;
alert(lol);
ws.send(lol+" <p>\b\n\r");
ws.close();
console.log(ws.readyState);
if(ws.readyState ==2){
alert("ws.terminate");
return ws.terminate();
}
}
如果您查看图片和代码,您可以看到我使用了ws.close
,但它似乎没有做某事缓冲区未为零并且它仍然连接这是什么的图片ws.close() 之后 Websocket 的状态,我认为 ws.close() 等待服务器也关闭连接,当服务器在关闭服务器之前等待接收某些东西时,这是一个错误。
我的 pthon 服务器如果从来没有
async def Time(websocket, path):
try:
a=await websocket.recv()
print("final receive:"+str(a)+"/")
a=str(a).split("<p>")
a=a[0]
print("/"+str(a)+"/")
except:
print("erreur")
finally:
socketout(bytes(a.encode("utf-8")))
print("loop stop")
loop.stop()
print("loop ad stop")
start_server = websockets.serve(Time, "", 5678)
loop3=asyncio.get_event_loop()
loop3.run_until_complete(start_server)
视觉解释 感谢您的帮助 [![视觉][2]][2]
简短版本:因为 WebSocket
对象没有任何 terminate
方法。
close
方法(您正在调用的)足以关闭 websocket。您是从哪里了解到 terminate
方法的?
因为在你的问题中你在谈论 "hard close" 并且在你的代码中你正在做这个检查 ws.readyState == 2
我认为你正在寻找一些东西 ws.readyState == 3
.
调用 close
方法后稍等片刻即可。
onclose
属性 可以帮到你;尝试在脚本末尾添加以下行
ws.onclose = function(event) {
console.log("Socket hard closed", ws.readyState);
}
希望这对您有所帮助。
您尝试使用的 terminate
方法来自 WebSocket 的 服务器 实现(不是浏览器)。
如果担心close
方法没有真正关闭连接,可以自行验证。
在浏览器的控制台中,输入 let socket = new WebSocket("wss://javascript.info/article/websocket/demo/hello");
现在在 Shell 中输入 ping javascript.info
,这将为您提供远程 IPv6:2606:4700:20::681a:c11
.
现在输入 netstat -an -p tcpv6
应该会显示如下内容:
最后,在浏览器的控制台中输入 socket.close();
并再次输入 运行 netstat -an -p tcpv6
,您会注意到上一行已经消失了。
此外,您会注意到该行仍显示在浏览器的“网络”选项卡中:
所以在对套接字的状态进行假设时不要依赖它。