Tag: websocket

当对socket.send()进行快速调用时,websocket客户端间歇性地无法传输。

我有一个websocket服务器和客户端。 我可以build立连接并在两个方向上传输消息(数据)。 但是,当运行在Web浏览器中的客户端快速调用socket.send()时,服务器不会收到一些消息。 如果我减慢客户端调用socket.send()所有消息都由服务器接收。 为什么调用socket.send()的时间与间歇性丢弃消息有什么关系? 在Win7,Android和iOs上运行Chrome,FireFox和Safari时会出现这种情况。 所以我不认为这是一个浏览器的错误。 服务器是nodejs,但这是不相关的,因为服务器不是问题。 通过快速调用,我的意思是在由requireAnimationFrame()控制的循环中进行调用。 消息中的数据量很小,每个大约有40个字节。 有<10条消息,即连续调用socket.send()。 因此我不知道如何溢出一个TCP缓冲区。 但是也许? websocket处于“arrays缓冲”模式。 socket.bufferedAmount === 0每次发送前后,无论消息是否被客户端丢弃。 丢弃消息后,套接字继续在两个方向上发送消息。 例如,客户端将对socket.send()进行10次调用,服务器将看到除3和7之外的所有消息,而客户端将看到服务器发送的所有消息。 在调用socket.send()之前,我已经validation了数据的完整性。 客户端代码调用var tmpArrayBuffer = new ArrayBuffer(n)在每次调用socket.send(tmpArrayBuffer)之前创build一个新的缓冲区。 所以我不认为我的客户端代码覆盖自己的缓冲区。 从来没有一个错误的消息的情况。 消息要么完好无损,要么完全没有到达。 大多数消息到达。 我的老C程序员认为这是一个写过缓冲区的情况。 但我不明白这是如何在JavaScript中可能的,并给予socket.send()应该是我的责任的数据的结束。 我正在尝试使用MS消息分析器嗅探客户端和服务器之间的TCP通信。 然而,这是一个挑战,因为浏览器异或与websocket键意味着我必须手工解密每个消息。 慢,不好玩。 任何人有更好的主意? 我的代码是一个大型项目的一部分,这个项目太大,太复杂了。 我正在研究一个可能有助于debugging问题的小testing存根。 如果/当我得到它的工作,我会张贴存根(stub)。 在任何情况下,当调用socket.send()的时间间隔较长时,较大的项目“工作”,因此我不认为这是项目中其他代码的问题。 我认为这是我的理解如何使用websockets和/或TCP的问题。 另一个线程提示反病毒软件(stackoverflow问题21191620)。 我试过禁用我的防病毒软件。 没有效果。 此外,Android手机和iTouch上的问题是相同的,它们并不运行防病毒软件。 这是多年来我第一次无法通过诸如计算器(stackoverflow)之类的网站在网上进行研究来解决问题。 我已经search了这个问题,直到我的手指麻木。 于是我终于在这里创build了一个帐户并发布了一个问题。 请帮忙!

什么是通过WebSockets发送位置更新的正确方法?

我需要在运行node.js的游戏世界中广播位置更新。 我目前的想法是使用BinaryJS 。 不过,我不确定使用它的正确方法是什么。 我曾经想过3个选项: 我现在怎么样,使用socket.io :我以编程方式存储在给定的时间内发生的位置更新的缓冲区,然后一次发送它: setTimeout(function(){ //called a fixed amount of times per second (40) //this variable will hold the accumulated position changes on the last 25ms //var accumulated_position_changes = [id0,x0,y0,z0, id1,x1,y1,z1…]; client.send(accumulated_position_changes); },25); 但是,如果binary.js完成分块(是吗?),那么每次发生位置变化时,我应该不加区别地发送位置更改吗? MyClass.prototype.set_position = function(x,y,z){ // this is called thousands times a second this.x = x, this.y = y, this.z […]

Web套接字和Flash套接字客户端连接到一个Node.js

我有问题连接Flash客户端到Node.js服务器。 小故事 : 我第一次构build一个应该由Web客户端(WebSocket)以及Flash客户端(Socket)使用的Node.js服务器。 当然,networking客户端就像一个魅力,但我无法克服闪存。 我得到SECURITY_ERROR。 经过一天的研究,我认为这是因为政策文件没有被加载。 想法(primus在engine.io顶部)? 长篇小说 : 我使用Primus,因为我想我会需要它,因为我有networkingsockets和闪光灯sockets来处理。 不确定这是否准确? 🙂 我使用Engine.io作为“变换器/传输器” – 图层使用的主要框架。 我不会讨论标准的Web客户端(使用Chrome和primus-client),因为它很容易设置。 我在AS3中使用简单和标准的套接字: _socket = new Socket(); _socket.addEventListener(Event.CONNECT, onSocketConnect); //… _socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError); _socket.addEventListener(IOErrorEvent.IO_ERROR, onIOError); _socket.connect('localhost', '1337); 在Flash IDE中构build它时,它将转到onSocketConnect函数,但是如果我尝试向onSocketConnect写入任何内容,则会断开连接。 如果我从Web浏览器运行这个,我进入onSecurityError方法。 我必须说,我没有得到任何在节点控制台的痕迹! primus.on('connection', function connection(spark) { console.log('new connection'); // never gets logged! 据我所知,当策略文件出现错误时会引发安全错误,所以我开始寻找解决scheme。 我已经在线阅读了很多东西,最常见的解决scheme是简单的使用socket.io ,所以叫做FlashSocket.IO 。 我尝试过实现它,但它太老了,有些代码是一种失踪,我终于从hurlant图书馆得到一些错误 – 我无法得到它的工作。 我还看到一些名为policy节点包,它运行单独的服务器到服务器的策略文件。 我尝试在其中添加一个flashsocket transport数组 […]

如何尝试赶上ws错误“getaddrinfo ENOTFOUND”?

我正在使用使用WebSocket“ws”连接到另一台服务器的nod​​ejs。 但是,有时当服务器B不可达时,主要是“getaddrinfo ENOTFOUND”问题会阻止我的服务器,这是不被接受的,我应该使用try catch来处理情况并尝试以后连接。 我应该在哪里试试catch? 它不会触发ws.onerrorcallback。 我发现在如何捕获getaddrinfo ENOTFOUND类似的情况 但我不知道如何使用这种方法的ws接口。

Scoket.IO v1.0.x基于令牌的身份validation – 不能传递令牌?

我正在使用本教程来获得基于令牌的身份validation系统的基础知识。 这是我正在使用的代码: 在app.html中: var socket = io('', { // originally I thought the $.param might've been a problem, so I hard coded a token instead // query: $.param({token: 'i271az2Z0PMjhd6w0rX019g0iS7c2q4R'}) query: "token=i271az2Z0PMjhd6w0rX019g0iS7c2q4R" }); 在index.js中: var app = require('express')(); var http = require('http').Server(app); var io = require('socket.io')(http); var tokens = [ 'i271az2Z0PMjhd6w0rX019g0iS7c2q4R', 'oWD4sh1eU2Yhn95C05t2YKrKMVWoAFAk' ]; io.set('authorization', function(handshakeData, callback) […]

我怎样才能使私人聊天室sockjs?

我试图build立一个聊天系统,只有两个用户可以互相交谈(很像Facebook的聊天) 我尝试了多路复用,使用mongoDB的_id作为名称,所以每个通道都是唯一的。 我面临的问题是我不能将消息直接指向单个客户端连接。 这是首先发送消息的客户端代码 $scope.sendMessage = function() { specificChannel.send(message) $scope.messageText = ''; }; 这是接收消息的服务器端 specificChannel.on('connection', function (conn) { conn.on('data', function(message){ conn.write('message') } } 当我发送一条消息到任何一个频道时,每个频道仍然收到这条消息。 我怎样才能使每个客户端只收听发送到特定频道的消息?

nodejs websocket和http基本authentication

我想在我的nodejs websocket应用程序中实现http基本身份validation身份validation。 这是我的一段代码: var http = require('http'); var auth = require('http-auth'); var express = require('express'); var app = express(); //…. basic = auth.basic({ realm: "websocket auth", file: __dirname + "/users.htpasswd" }); var server = http.createServer(basic); app.listen = function() { return server.listen.apply(server, arguments); }; // WEBSOCKET var WebSocketServer = require('websocket').server; var wss = new WebSocketServer({ httpServer: […]

在nodejs分叉进程之间共享数千个打开的websockets

我正在开发一个由移动应用程序,桌面应用程序和服务器组成的项目。 服务器将需要随时在桌面应用程序中维护一个开放的套接字(dropbox如何做!)。 移动应用程序打开后,移动应用程序和服务器之间将打开一个套接字,桌面应用程序将向移动应用程序发送事件(可能带宽相当低),反之亦然。 服务器最大的障碍是在一台相当普通的服务器上同时打开很多套接字。 大多数时候,由于人们不会使用应用程序,套接字将闲置。 我只有一个人,而且我不想在服务器成本上花费一大笔钱,所以我想我会selectnodejs,因为它能够以低内存使用率打开大量websocket(通常我会使用Java,但我认为内存将很快成为一个问题)。 我无法打包的问题是处理nodejs和cluster api。 由于集群API生成一个单独的nodejs进程,我将如何共享分叉进程之间的WebSocket连接? 如果我不能做到这一点,我必须保证,移动websocket是打开在同一个节点进程,它是桌面客户端websocket打开。 不知道我能做到这一点。 我有什么select?

meteor:在WebSocket握手期间出错:意外的响应代码:400

什么可能是错误的可能原因Error during WebSocket handshake: Unexpected response code: 400 ? 该应用程序在Ubuntu上托pipe,并使用npm mup包进行部署。 我在mup.json中包含了捆绑的ssl pem文件。 还有什么我需要在服务器上configuration?

websockets – 拒绝套接字连接

我正在使用ws作为我的node.js库的套接字库。 所以我的问题是,如果用户没有通过授权过程,我怎么能拒绝一个连接。 var WebSocketServer = require('ws').Server; var wss = new WebSocketServer({port: 6969}); wss.on('connection', function(socket){ // if the socket.upgradeReq.headers.cookie doesn't exists, reject the client }) 非常感谢