Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何更改打开WebSocket的超时?_Javascript_Ios_Websocket_Mobile Safari_Django Channels - Fatal编程技术网

Javascript 如何更改打开WebSocket的超时?

Javascript 如何更改打开WebSocket的超时?,javascript,ios,websocket,mobile-safari,django-channels,Javascript,Ios,Websocket,Mobile Safari,Django Channels,又短又甜: 在尝试打开一段时间后,如何告诉WebSocket停止或“关闭” 我目前正在开发一个类似Kahoot的web应用程序,玩家可以通过手机连接进行游戏。该游戏完全使用普通JavaScript在后台运行所有内容,并使用WebSocket与django Channel游戏服务器通信。除了玩家意外锁定手机或切换应用程序并关闭WebSocket的情况外,这款游戏玩得很好。我可以很容易地打开一个新的连接,但由于某些原因,在mobile safari中,WebSocket需要很长时间才能放弃连接 例如

又短又甜: 在尝试打开一段时间后,如何告诉WebSocket停止或“关闭”

我目前正在开发一个类似Kahoot的web应用程序,玩家可以通过手机连接进行游戏。该游戏完全使用普通JavaScript在后台运行所有内容,并使用WebSocket与django Channel游戏服务器通信。除了玩家意外锁定手机或切换应用程序并关闭WebSocket的情况外,这款游戏玩得很好。我可以很容易地打开一个新的连接,但由于某些原因,在mobile safari中,WebSocket需要很长时间才能放弃连接

例如:

  • 用户通过Wifi连接并打开WebSocket
  • 用户断开Wifi连接并在不调用
    的情况下丢弃WebSocket。关闭
    并正确关闭连接
  • 用户尝试在没有Wifi的情况下打开新的WebSocket
  • 用户然后连接到Wifi,而以前的WebSocket仍在尝试连接
  • 在我的测试中,第二个WebSocket将尝试连接至少一分钟,然后最终放弃并失败。只有这样,我才能尝试重新连接,只是夸大了重新连接球员的整个过程

    就像我上面问的:我如何缩短这个过程?有没有办法让WebSocket尽早放弃,还是我做得不对

    如果我需要补充更多信息,请告诉我。这是我第一次发帖


    非常感谢

    在中的任何地方都没有提到连接超时,在任何webSocket文档中也找不到任何提及。因此,您可能需要实现自己的。有一种方法可以做到这一点:

    function connectWebSocket(url, timeout) {
        timeout = timeout || 2000;
        return new Promise(function(resolve, reject) {
            // Create WebSocket connection.
            const socket = new WebSocket(url);
    
            const timer = setTimeout(function() {
                reject(new Error("webSocket timeout"));
                done();
                socket.close();
            }, timeout);
    
            function done() {
                // cleanup all state here
                clearTimeout(timer);
                socket.removeEventListener('error', error);
            }
    
            function error(e) {
                reject(e);
                done();
            }
    
            socket.addEventListener('open', function() {
                resolve(socket);
                done();
            });
            socket.addEventListener('error', error);
        });
    }
    
    // Usage    
    connectWebSocket(yourURL, 1000).then(function(socket) {
        socket.send("hello");
        // put other code that uses webSocket here
    }).catch(function(err) {
        console.log(err);
    });
    

    你读过这么多问题吗?什么是客户端开发环境?在这里,您可以检查webSocket接口,查看它提供的超时或重试值。它只是一个浏览器吗?还是别的?@jfriend00它只是两个浏览器:Android上的Chrome和iOS上的Safari。我一直在寻找超时值和重试值,但没有找到太多。如果有人能给我指出正确的方向,那就太棒了。使用你的代码建立WebSocket非常有效,但我在调用该函数返回的对象时得到
    WebSocket.send不是一个函数。我遗漏了什么吗?@kawub-因为我推荐的名为
    websocket
    的代码中没有任何变量,所以我不知道你在做什么。和往常一样,我只能在我能看到的代码上提供帮助。您可以在问题的末尾添加您尝试的代码,以便我可以看到它。此函数返回承诺,而不是webSocket对象。你必须像我所展示的那样使用这个承诺才能从中获得插座。