如果 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,您会注意到上一行已经消失了。

此外,您会注意到该行仍显示在浏览器的“网络”选项卡中:

所以在对套接字的状态进行假设时不要依赖它。