Cookie ベースのセッションを使用しようとしていますが、ネットワーク経由ではなく、ローカル マシンでのみ機能します。ただし、セッション関連のものを削除すると、ネットワーク上でうまく機能します...
ここで高品質のコードが不足していることを許していただく必要があります。ノード/ソケットなどから始めたばかりで、明確なガイドを見つけるのは難しいため、現在 n00b の領域にいます。基本的に、これはさまざまなスニペットからハッキングされたもので、私が実際に行っていることを約 10% 理解しています...
Chrome で表示されるエラーは次のとおりです。
socket.io.js:1632GET http://192.168.0.6:8080/socket.io/1/?t=1334431940273 500 (内部サーバー エラー)
Socket.handshake ------- socket.io.js:1632
Socket.connect ------- socket.io.js:1671
ソケット ------- socket.io.js:1530
io.connect ------- socket.io.js:91
(無名関数) ------- /socket-test/:9
jQuery.extend.ready ------- jquery.js:438
そして、サーバーのコンソールに次のように表示されます。
debug - 提供される静的コンテンツ /socket.io.js
デバッグ - 承認済み
警告 - ハンドシェイク エラー Cookie がありません
私のサーバーは次のとおりです。
var express = require('express')
, app = express.createServer()
, io = require('socket.io').listen(app)
, connect = require('express/node_modules/connect')
, parseCookie = connect.utils.parseCookie
, RedisStore = require('connect-redis')(express)
, sessionStore = new RedisStore();
app.listen(8080, '192.168.0.6');
app.configure(function()
{
app.use(express.cookieParser());
app.use(express.session(
{
secret: 'YOURSOOPERSEKRITKEY',
store: sessionStore
}));
});
io.configure(function()
{
io.set('authorization', function(data, callback)
{
if(data.headers.cookie)
{
var cookie = parseCookie(data.headers.cookie);
sessionStore.get(cookie['connect.sid'], function(err, session)
{
if(err || !session)
{
callback('Error', false);
}
else
{
data.session = session;
callback(null, true);
}
});
}
else
{
callback('No cookie', false);
}
});
});
var users_count = 0;
io.sockets.on('connection', function (socket)
{
console.log('New Connection');
var session = socket.handshake.session;
++users_count;
io.sockets.emit('users_count', users_count);
socket.on('something', function(data)
{
io.sockets.emit('doing_something', data['data']);
});
socket.on('disconnect', function()
{
--users_count;
io.sockets.emit('users_count', users_count);
});
});
私のページJSは:
jQuery(function($){
var socket = io.connect('http://192.168.0.6', { port: 8080 } );
socket.on('users_count', function(data)
{
$('#client_count').text(data);
});
socket.on('doing_something', function(data)
{
if(data == '')
{
window.setTimeout(function()
{
$('#target').text(data);
}, 3000);
}
else
{
$('#target').text(data);
}
});
$('#textbox').keydown(function()
{
socket.emit('something', { data: 'typing' });
});
$('#textbox').keyup(function()
{
socket.emit('something', { data: '' });
});
});