相关疑难解决方法(0)

WebSocket.onclose应该由用户导航或刷新触发吗?

第1部分:预期的行为?

我发现Firefox和Chrome之间的浏览器行为与onclose被调用的处理程序有关.

onclose如果它是由用户页面导航/刷新引起的,Chrome似乎不会触发.但是,Firefox确实触发了onclose.

在我看来,Firefox可能在这里表现正常:

当WebSocket连接可能干净地关闭时,用户代理必须创建一个使用CloseEvent接口的事件,事件名称为close,不会冒泡,不可取消,没有默认操作,其wasClean属性设置为true如果连接干净,则为false,否则将其code属性设置为WebSocket连接关闭代码,并将其reason属性设置为WebSocket连接关闭原因; 并将任务排队以首先将readyState属性的值更改为CLOSED(3),然后在WebSocket对象上调度该事件.

来源:http://www.w3.org/TR/2011/WD-websockets-20110419/#closeWebSocket

即使它可能导致一些偷偷摸摸的代码/意外行为.

任何人都可以确认预期的行为吗?

第2部分:如何实现自动重新连接?

如果您有一个为用户自动重新连接的库,您如何知道是否应该尝试重新连接?你检查CloseEvent.wasClean房产吗?我不得不假设'干净'意味着关闭应该通过API调用WebSocket.close()或服务器发送关闭帧发生?如果网络错误导致关闭,我猜测wasClean会是false什么?

在Pusher JavaScript库中,我们假设(关闭 - >等待 - >连接)关闭应触发重新连接,除非我们处于关闭状态 - 开发人员已选择关闭连接.似乎socket.io客户端库做出了相同的假设.

基于此,由用户导航/刷新引起的Firefox onclose事件触发了不必要的重新连接,因为两个库都没有检查该CloseEvent.wasClean属性.

示例和视频

这是一个可用于演示不一致性的示例:http: //jsbin.com/awonod/7

这是我演示问题的视频:http: //www.screenr.com/vHn8 (已经很晚了,忽略了几个漏洞:))

需要注意的一点是,我按下Escape键也可能导致WebSocket连接关闭.但是,如果您仔细观察或亲自尝试,您将看到在页面刷新之前记录关闭事件.

reconnect event-handling websocket

32
推荐指数
1
解决办法
1万
查看次数

我如何在Socket.io中处理Close事件?

我正在制作基于Web的简单在线游戏.游戏使用Socket.io互相进行网络互动.但我遇到了这个问题.

想想以下情况.我运行了Socket.io服务器.一个玩家制作房间,其他玩家加入房间.他们玩游戏一段时间..但是一个玩家如此愤怒并关闭游戏标签.

在这种情况下,如何在服务器端获取一个客户端关闭浏览器的事件?

根据谷歌搜索,人们这样说:"使用浏览器关闭事件,如onBeforeUnload"

但我知道所有浏览器都不支持onBeforeUnload事件.所以我想要在SERVER SIDE中检查客户端断开连接事件的解决方案.

在Socket.io(nodeJS)服务器端控制台中,当客户端的连接关闭时,控制台说如下:

调试 - 丢弃传输

我的nodeJS版本是0.4.10,Socket.io版本是0.8.7.两者都在Linux上运行.

有人可以帮忙吗?

短代码在这里:

var io = require ( "socket.io" ).listen ( 3335 );
io.sockets.on ( "connection" , function ( socket )
{
  socket.on ( "req_create_room" , function ( roomId ) 
  {
    var socketInstance = io
    .of ( "/" + roomId )
    .on ( "connection" , function ( sock )
    {
       sock.on ( "disconnect" , function () 
       {
          // i want this socket data always displayed...
          // but first-connected-client doesn't fire …
Run Code Online (Sandbox Code Playgroud)

node.js socket.io

12
推荐指数
2
解决办法
2万
查看次数

如何捕获WebSocket连接中断?

在Firefox(至少)中,如果你按ESC,它将关闭所有打开的WebSockets连接.我需要捕获断开连接并尝试重新连接一旦它再次可用.

这是我试图实现的代码的一个示例,但是我能想出的任何内容都不会捕获错误并允许我优雅地处理它.

看看代码:http://jsfiddle.net/w5aAK/

var url = "ws://echo.websocket.org";
    try {
        socket = window['MozWebSocket'] ? new MozWebSocket(url) : new WebSocket(url);
        socket.onopen = function(){
            console.log('Socket is now open.');
        };
        socket.onerror = function (error) {
            console.error('There was an un-identified Web Socket error');
        };
        socket.onmessage = function (message) {
            console.info("Message: %o", message.data);
        };
    } catch (e) {
        console.error('Sorry, the web socket at "%s" is un-available', url);
    }

setTimeout(function(){
    socket.send("Hello World");
}, 1000);
Run Code Online (Sandbox Code Playgroud)

打开控制台并观察输出.

我在这里做错了,还是因为连接在JS脚本范围之外运行而不可能?

任何输入都会有所帮助.

谢谢!

javascript websocket

11
推荐指数
1
解决办法
2万
查看次数

WDS已断开连接!不断出现

运行webpack-dev-server很好.首页加载正常.但是当我刷新浏览器时,每2秒'WDS disconnected'会出现在控制台和浏览器中无限重新加载.此问题仅出现在Firefox/Firefox Developer Edition浏览器中.浏览器Chrome,Edge,IE11没有问题. 安慰. 错误跟踪

package.json:
....
"webpack": "^1.13.3",
"webpack-dev-server": "^1.16.2"

webpack.config.js:
....
entry: [
    //'app': './app/app.ts'
 'webpack-dev-server/client?http://localhost:8080/', './app/app.ts'

],
output: {
    publicPath: 'http://localhost:8080/',
    filename: 'app/app.bundle.js'
},
....
Run Code Online (Sandbox Code Playgroud)

Firefox Developer Edition 51.0a2

firefox websocket sockjs webpack webpack-dev-server

8
推荐指数
0
解决办法
5365
查看次数

订阅未使用ApolloServer连接

我正在尝试建立订阅并使用ApolloServer(v 2.2.2)。我的安装程序突然突然停止工作。当我尝试连接到graphiql/中的订阅时,Playground出现错误:

{
  "error": "Could not connect to websocket endpoint ws://localhost:4000/graphql. Please check if the endpoint url is correct."
}
Run Code Online (Sandbox Code Playgroud)

由于我的应用程序中有休息端点,因此我需要表达自己的观点,但是我无法从下面的运行中获得最少的示例:

import http from 'http';
import { ApolloServer, PubSub } from 'apollo-server-express';
import express from 'express';

const pubsub = new PubSub();

// The DB
const messages = [];

const typeDefs = `
type Query {
  messages: [String!]!
}
type Mutation {
  addMessage(message: String!): [String!]!
}
type Subscription {
  newMessage: String!
}

schema {
  query: Query
  mutation: …
Run Code Online (Sandbox Code Playgroud)

javascript graphql apollo-server graphql-subscriptions

6
推荐指数
1
解决办法
1774
查看次数

socket.io ws://的连接在页面加载时被中断

我不知道为什么,但我仍然在我的网站上收到此错误(在nodejitsu.com上托管).如果我在localhost上测试项目一切顺利,但如果我在浏览器中打开它,则显示错误..

我正在寻找这个问题,但我没有找到任何有用的东西..

socket.io

5
推荐指数
1
解决办法
1702
查看次数