【问题标题】:how to close a websocket like if chrome window was closing to flush the buffer to 0如何关闭 websocket,例如关闭 chrome 窗口以将缓冲区刷新为 0
【发布时间】:2020-09-29 21:55:01
【问题描述】:

当通过互联网传递 websocket 并且仅在连接关闭时发送(在我的网络上就是这样),我首先尝试通过关闭 chrome 来关闭 websocket(它有效),所以现在我发现终止我think 可以做到与关闭浏览器相同,但仅适用于具有此功能的服务器,并且

问题是关闭的缓冲区不是0而是13...

那么我怎样才能使用hard closews.terminate 或其他方法来将缓冲区刷新为0 以及类似下面的基本代码而不会出现错误? em>

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,但它似乎没有做任何事情,缓冲区不是零并且它仍然连接这是一张关于状态的图片Websocket 在 ws.close() 之后,我认为 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]

【问题讨论】:

    标签: javascript networking websocket tcp network-programming


    【解决方案1】:

    短版:因为WebSocket 对象没有任何terminate 方法。

    close 方法(您正在调用)足以关闭 websocket。您从哪里了解到terminate 方法?

    由于在您的问题中您正在谈论“硬关闭”并且在您的代码中您正在执行此检查ws.readyState == 2 我认为您正在寻找拥有ws.readyState == 3 的东西。

    只需在调用close 方法后等待一段时间即可。

    onclose 属性可以帮助您;尝试在脚本末尾添加以下行

    ws.onclose = function(event) {
      console.log("Socket hard closed", ws.readyState);
    }
    

    希望这会有所帮助。

    【讨论】:

    • 我听说过 websocket.terminate stackoverflow.com/questions/41074052/… 问题是在 webbrowser 编码工具的网络页面上的 ws.close() 之后,它并没有只等待时间,ws.close 等待服务器也关闭通信以放置 3(使用 ws 就绪状态),当服务器没有收到任何东西时,他永远不会关闭它
    • 那么,可能是服务器问题;反正close之后通讯就中断了,是什么问题?
    • 我不认为是服务器问题,当服务器向客户端发送某些内容时,我遇到了套接字和 websocket 的问题,但在这个案例中,它进行了艰难的关闭工作,并且成功发送了一些东西。如何我已经关闭了一段时间并且没有等待?我给你的链接中的终止符是什么?
    • 我需要一个关闭套接字的函数,而不会像关闭浏览器那样关闭状态
    • .terminate() 方法在 ws package 中,但它是在浏览器上不起作用的服务器端实现(参见自述文件的第一行)。无论如何,我很清楚你想要什么,但我不清楚为什么你想要它。如果只是浪费结果,从工程的角度来看,你花在这个问题上的时间比CLOSING WebSocket浪费的所有资源要多得多。 ;)
    【解决方案2】:

    您尝试使用的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,你会发现上一行已经消失了。

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

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

    【讨论】:

    • 所以你说连接很接近但为什么服务器看不到它,我遇到了套接字问题,服务器只能看到客户端发送数据的答案客户端正确关闭连接。我不明白为什么它不起作用?
    • 我已经回答了您关于如何在客户端关闭 WebSocket 的问题,现在很抱歉,我无法帮助您诊断到目标服务器的整个网络链。您的连接可能因为一些中间网络设备而半关闭superuser.com/questions/298919/…
    • 我怎样才能从一半接近关闭这是我的问题,我想要一个真正紧密的连接,就像我们关闭客户端程序 so how can i do a hard close with ws.terminate and a basic code like the one under without having the error? 这是帖子中的问题
    • 你不能做一个比ws.close()更“难”的关闭,因为你不能用JavaScript控制中间网络设备。如果由于某种原因,设备丢弃了 TCP 数据包,FIN 消息将无法到达服务器,从而导致连接半关闭
    • 如果你想解决这个问题,我建议你使用Wireshark之​​类的网络分析工具来监控客户端和服务器发送和接收的实际消息。另外,您的问题提到了 JavaScript,但您的问题根本与 JavaScript 无关,您已经用 JavaScript 完成了所有需要做的事情。
    猜你喜欢
    • 2011-05-16
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多