小编Jos*_* Mc的帖子

我该怎么用?Socket.io房间还是Redis pub-sub?

非常简单的问题.我正在使用nodejs作为我的后端构建一个实时游戏,我想知道是否有任何信息可用哪个更可靠哪个更有效?我在整个代码中大量使用Redis和Socket.io.所以我想知道我是否应该使用Socket.io的房间,或者我最好使用redis'pub -sub

更新: 刚刚意识到有一个非常重要的原因,你可能想在socket.io房间使用redis pub/sub.使用Socket.io房间发布给监听器时,(浏览器)客户端收到消息,redis实际上是(redis~on on server)客户端收到消息.因此,如果您想要通知所有(服务器)客户端特定于每个客户端的信息,并且可能在传递给浏览器客户端之前进行一些处理,那么最好使用redis.使用redis你可以发起一个事件来生成每个用户的个人数据,就像socket.io一样,你必须一次实际生成所有用户的唯一数据,然后遍历它们并发送它们各自的数据,这几乎击败了房间的目的,至少对我而言.

不幸的是,就我的目的而言,我现在仍然坚持使用redis.

更新2:结束开发插件只使用2个redis连接,但仍然允许单独的客户端处理,请参阅下面的答案....

publish-subscribe redis node.js socket.io

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

如何在WebGL中为对象设置动画(修改特定顶点不是完全变换)

好的,

我是3D图形的新手,我想在模型中为各个特定顶点设置动画(不是整个模型变换).我的脚本主要基于NEHE webgl教程.在本教程中,所有对象顶点都存储在缓冲区中,该缓冲区在首次运行程序时初始化一次.这是初始化代码:*注意顶点包含顶点数组

vertexBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
vertexBuffer.itemSize = 3;
vertexBuffer.numItems = parseInt(vertices.length/vertexBuffer.itemSize);
Run Code Online (Sandbox Code Playgroud)

现在因为它们在开始时被初始化,显然改变顶点数组将不起作用.所以我想知道如何实时修改顶点的最佳方法,同时仍保持其足够高效以便顺利运行.

是否有可能以某种方式重新绑定缓冲区,例如在每个动画时刻再次运行此代码?

gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
Run Code Online (Sandbox Code Playgroud)

干杯,J

javascript animation buffer webgl vertex

21
推荐指数
1
解决办法
7304
查看次数

如何使用redis,express和socket.io让会话正常工作?

所以我试图让Sessions在我的socket.on('connection',...)中工作.我正在尝试使用最新版本:Socket.io - 0.9.13,Express - 3.1.0和最新版本其他模块.

无论如何,我尝试使用' connect-redis '和' session.socket.io ' 两个模块,他们都有类似的问题.

在我的代码中我有2个redis商店(socketio.RedisStore和require('connect-redis')(快递)),现在这个程序都运行正常,但因为express和socket.io需要共享会话数据,我想知道是否此设置将正确使用会话?会话存储需要与express/socketio相同吗?对我来说有点灰色区域,因为2 RedisStore将在后台使用相同的数据库?

我曾尝试在两个地方使用socket.io redisStore或connect-redis redisStore,但socket.io不喜欢connect-redis redisStore和express不喜欢socketio.redisStore.

如果我使用connect-redis RedisStore,那么socket.io/lib/manager.js抱怨:this.store.subscribe(... TypeError Object#没有方法'subscribe'

如果我使用socketio.RedisStore然后表达/ node_modules/connect/lib/middleware/session.js抱怨:TypeError:Object#没有方法'get'

*注意我宁愿让session.socket.io插件工作,但是当我使用该插件进行相同的设置时,表达(也)抱怨:TypeError:Object#没有方法'get'

所以我可以使用2个不同的RedisStore进行会话,或者我是否需要以某种方式让一个或另一个为两者工作,如果是这样,任何关于如何修复的想法?

我当前的代码如下所示:

var
    CONST = {
        port: 80,
        sessionKey: 'your secret sauce'
    };

var 
    redis = require('redis');

var 
    express = require('express'),
    socketio = require('socket.io'),
    RedisStore = require('connect-redis')(express);

var 
    redisStore = new RedisStore(),
    socketStore = new socketio.RedisStore();

var 
    app = express(),
    server = require('http').createServer(app),
    io = socketio.listen(server);

app.configure(function(){
    app.use(express.cookieParser( CONST.sessionKey ));
    app.use(express.session({ secret: CONST.sessionKey, store: redisStore })); …
Run Code Online (Sandbox Code Playgroud)

session redis express socket.io node-redis

9
推荐指数
1
解决办法
3999
查看次数

如何在单页应用程序(SPA)中实现ReCaptcha

我有一个单页应用程序(SPA)我想添加ReCaptcha.此应用程序使用IIS作为平面Html,Css和Javascript进行托管,此SPA依次与所有动态内容的单独REST服务器(使用CORS)进行通信.

REST服务器使用ASP.net WebAPI编写.问题是; 我所看到的所有ReCaptcha的例子都使用ASP.net MVC(或其他语言)将html注入网页,我无法在这个庄园中使用ASP.net修改网页.希望其他人遇到同样的问题.

我真的在寻找两个部分,首先是客户端上的HTML,其次是REST服务器上的控制器,用于验证谷歌.即使这是我可以转换的另一种语言,这将是有用的!

javascript asp.net recaptcha asp.net-web-api

7
推荐指数
1
解决办法
4450
查看次数

如何在服务器离线时销毁仅 http 的 cookie?

我有一个通过 REST 与 Web 服务器通信的 Web 应用程序,该 Web 应用程序可以在公共计算机上运行,​​并允许多个用户在给定的时间段内登录和注销。

所有 cookie 都是 HTTP-only,这只是一种额外的安全措施,以涵盖成功的 XSS 攻击案例。这意味着必须进行 REST 调用以强制注销。

我担心的是,当网络服务器因任何原因出现故障时(或变得无法访问,例如某处网络电缆断开连接)。当用户点击注销时,实际上无法删除 cookie。这意味着用户可能会离开 PC,同时当连接恢复或服务器恢复时另一个用户可能会出现,并继续使用以前的用户帐户。

处理这个用例的典型方法是什么?(诚​​然不是特别常见)。

javascript security rest httpcookie

7
推荐指数
1
解决办法
1712
查看次数

如何生成一个文件,并提供它在普通的JavaScript下载?

我想动态生成javascript文本文件,然后提供下载.目前,我可以通过以下任一解决方案获得此工作:

content = "abc123";
document.location = "data:text/octet-stream," + encodeURIComponent(content);
Run Code Online (Sandbox Code Playgroud)

要么

content = "abc123";    
var bb = new BlobBuilder();
bb.append(content);
var blob = bb.getBlob();
blob = blob.slice(0, blob.size, 'text/octet-stream');
var fr = new FileReader(); 
fr.onload = function() {document.location = this.result;}
fr.readAsDataURL(blob);
Run Code Online (Sandbox Code Playgroud)

但是,当下载框出现时,这两种解决方案只会在另存为对话框中提供默认文件名"下载".

我的问题基本上是,如何将其更改为特定的文件名,例如'readme.txt'或'scene.obj'

另请注意,数据类型以前是"text/plain",但是如果使用此文档,则文档会切换到新的文本文档,而不是提供下载(如text/octet-stream似乎那样).

我不想要一个flash解决方案,javascript/html5只有建议.

干杯,乔希

javascript html5 blob download fileapi

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

尝试使用require('connect').utils.parseCookie与nodejs时找不到模块'connect'

我对nodejs等比较陌生.无论如何,我有一个我试图编写的程序,它使用基于此的会话/认证系统:http: //iamtherockstar.com/blog/2012/02/14/nodejs- and-socketio-authentication-all-way-down / 这是基于这个我认为(除了更新的更新版本) http://www.danielbaulig.de/socket-ioexpress/

(它使用Node.js,Express.js,Redis和Sockets.io)无论如何,当我尝试运行我的程序时,我收到此错误:

错误:无法在Module.require(module.js:354:15)的Function._load(module.js:279:25)上的Function._resolveFilename(module.js:332:11)处找到模块'connect'(需要)( module.js:370:17)at Object.(/home/jez/webdir/app1/app.js:62:19)在Module.load的Object..js(module.js:459:10)的Module._compile(module.js:441:26)处( module.js:348:31)在Array.0的Function._load(module.js:308:12)(module.js:479:10)

这对应的代码行是:

var parseCookie = require('connect').utils.parseCookie;
Run Code Online (Sandbox Code Playgroud)

现在在这两个教程中,他们在调用方法parseCookie()之前使用了这一行,但是在他们两个中他们都没有谈到要求'connect'模块,只有我相信的appon连接构建的express模块​​.我的程序与express完美配合,在上述教程中进行调整之前运行正常.

我觉得它可能是对node.js/express/socket.io的最新更新,但该教程仅在几天前写过?,对此的任何帮助将不胜感激!

session connect node.js express

5
推荐指数
2
解决办法
3208
查看次数

重定向到另一个域然后返回后丢失会话

我正在创建一个登录系统,在该系统中我使用个人电子邮件地址作为我数据库中的唯一标识符。人们可以使用任何 openid 提供程序登录,例如 google ect(也可以是 facebook),它只会将电子邮件作为唯一标识符存储在我的 sql 数据库的用户表中。(意味着我不必担心电子邮件验证、密码等问题,用户不必注册)。

这是有效的,通过使用链接/javascript 打开一个新窗口,然后我的 php 脚本被定向到 google 或任何提供者。然后他们输入详细信息,然后 google/ect 会自动将窗口连同(如果有效)用户详细信息(最重要的是电子邮件)重定向回我的登录脚本。

现在我查看电子邮件的响应,看看它是否在我的数据库中,如果没有添加它,如果是,使用 $_SESSION,将用户登录到我的站点。

我使用 openid 机制(谷歌、雅虎等)完美地完成了这项工作。我也试图让它与 facebook 一起工作,但遇到了很大的困难。它能够将用户登录到 fb,获取用户电子邮件等。但是,一旦我尝试将用户登录到我的网站,它就不起作用。出于某种原因,它为我打开的新窗口(并且我的脚本 + 重定向运行)有一个单独的会话(包括单独的 sessionid),然后到我网站的其余部分?

只是想知道是否有人知道为什么会发生这种情况。

这是登录脚本的样子(在新窗口中运行):

<?php 

   $app_id = "YOUR_APP_ID";
   $app_secret = "YOUR_APP_SECRET";
   $my_url = "YOUR_URL";

   session_start();
   $code = $_REQUEST["code"];

   if(empty($code)) {
     $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection
     $dialog_url = "https://www.facebook.com/dialog/oauth?client_id=" 
       . $app_id . "&redirect_uri=" . urlencode($my_url) . "&scope=email&state="
       . $_SESSION['state'];

     echo("<script> top.location.href='" . $dialog_url . "'</script>");
   }

   if($_REQUEST['state'] == $_SESSION['state']) {
     $token_url = "https://graph.facebook.com/oauth/access_token?"
       . "client_id=" …
Run Code Online (Sandbox Code Playgroud)

php session facebook login session-variables

4
推荐指数
2
解决办法
9154
查看次数

在PHP中加载/包含许多文件是否更快?

我有一个2000行函数文件,我已经意识到我可以将它分成一个回合4个文件,并且只包含一个所需的文件.目前它非常整洁,理想情况下我想保持这种状态,但是如果可以获得速度增加,我想仅在特定条件下包含不同的部分.

我的问题基本上是,如果有一个if语句并且只加载所需的php函数会更快.速度是一个因素,因为这个库是在ajax轮询情况下调用的.

php ajax performance include

3
推荐指数
1
解决办法
216
查看次数

在 Node.js 中,哪些存储技术可用于实时游戏

我计划尝试使用 html5 和 node.js 进行实时游戏开发。我之前制作了一个游戏,使用轮询来模拟游戏中的实时更新。我的实时游戏将使用 AJAX 来保持游戏在多个客户端之间同步。基本上,每当游戏状态发生变化时,我都会更新相关数据库行中的 Last_updated 字段。每当客户端轮询服务器时,它都会检查自上次轮询返回任何相关更新以来发生的任何更新(通过将先前轮询时间与 last_updated 字段进行比较来执行此操作)。

在我的游戏新版本中,我使用了node.js(和网络套接字),我想避免这样的机制,我必须不断搜索数据库以查找是否有更新。我想知道是否有其他方法可以存储重要的游戏状态信息,而无需以这种方式使用数据库。

我真的希望能够设置事件在游戏状态更改时在所有客户端上触发,而不必不断检查更改,因为这将节省大量的处理/查询。我真的不知道在一个客户端上触发的事件是否可以发送到也连接到我的 node.js 运行服务器的其他客户端。我一直使用数据库来完成这类事情,但我真的希望还有其他更好的选择?

干杯,乔什

javascript database websocket node.js

0
推荐指数
1
解决办法
699
查看次数