我发现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
即使它可能导致一些偷偷摸摸的代码/意外行为.
任何人都可以确认预期的行为吗?
如果您有一个为用户自动重新连接的库,您如何知道是否应该尝试重新连接?你检查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连接关闭.但是,如果您仔细观察或亲自尝试,您将看到在页面刷新之前记录关闭事件.
我正在制作基于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) 在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脚本范围之外运行而不可能?
任何输入都会有所帮助.
谢谢!
运行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
我正在尝试建立订阅并使用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) 我不知道为什么,但我仍然在我的网站上收到此错误(在nodejitsu.com上托管).如果我在localhost上测试项目一切顺利,但如果我在浏览器中打开它,则显示错误..
我正在寻找这个问题,但我没有找到任何有用的东西..