簡體   English   中英

不需要的Socket.IO連接

[英]Unrequested Socket.IO Connection

當我導航到站點的子頁面時,socket.io服務器正在運行索引頁面的連接模塊。

這是導航到www.example.com/query后的完整控制台日志

authenticated updated ==> { GbLZ5jxHz0S5uyNNAAAA: { user: 'yrn1jro2fw1nk4dyy4', group: 'uehw1o2grq1oy11y9xrgyw' } }
client connected to INDEX with id GbLZ5jxHz0S5uyNNAAAA
preloading index
client connected to QUERY with id GbLZ5jxHz0S5uyNNAAAA
preloading query

我要解決的主要問題是第二和第三行。 我希望連接到“ QUERY”,但不能連接到“ INDEX”。

當我導航到www.example.com時,控制台將通過單個連接按預期方式打印。

這是我剛才簡化並運行的整個server.js文件,用於生成上面的簡化控制台日志。 您可以忽略身份驗證的內容,對於那些可能會覺得有用的人,我主要包括在內。

var express = require('express');
var app = express();
var server = require('http').Server(app);
var io = require('socket.io')(server);
var util = require("./js/util.js");

var authenticated = {}; // [socket_id:{user:000,group:000},socket_id:{user:000,group:000}] // stores currently authenticated sockets

server.listen(80);

app.get('/', function (req, res) {
  res.sendFile(__dirname + '/index.html');
});

app.get('/query', function (req, res) {
  res.sendFile(__dirname + '/query.html');
});

 app.get('/favicon.ico', function (req, res) {
   res.sendFile(__dirname + '/favicon.ico');
 });

app.use("/js", express.static(__dirname + '/js'));
app.use("/css", express.static(__dirname + '/css'));
app.use("/images", express.static(__dirname + '/images'));

var mysql = require('mysql');
var db = mysql.createConnection({host:'localhost',user:'root',password:'fakepw',database:'baseofdata'});
db.connect();

var index = io.of('/').on('connection', function (socket) {
    // console.log(socket);
    console.log("client connected to INDEX with id",socket.id);
    socket.on("authenticate",function(data){
        console.log("authenticate data ==> ",data);
        db.query("SELECT user,usergroup FROM group_users INNER JOIN users ON group_users.user = users.id WHERE username = ? AND password = ?",[data.user,data.pass],function(err, rows) {
            console.log("auth returned ==> ",rows,err);
            if (err === null && rows.length > 0)
            {
                authenticated[socket.id] = {user:rows[0].user,group:rows[0].usergroup};
                encoded = {};
                encoded.user = util.encode(rows[0].user);
                encoded.usergroup = util.encode(rows[0].usergroup);
                socket.emit("authenticated",encoded);
                preload();
            }
            else socket.emit("unauthorized");
        });
    });

    if (typeof authenticated[socket.id] !== 'object')
    {
        console.log(socket.id,"does not exist -- sending unauthorized");
        socket.emit("unauthorized");
    }
    else preload();

    // OTHER INDEX LISTENERS HERE

    socket.on('disconnect', function(){
        delete authenticated[socket.id];
        console.log(socket.id,"deleted");
    });

    function preload()
    {
        console.log("preloading index");
        // PRELOAD INDEX
    }
});

var query = io.of('/query').on('connection', function (socket) {
    console.log("client connected to QUERY with id",socket.id);

    if (typeof authenticated[socket.id] !== 'object') 
    {
        console.log(socket.id,"does not exist -- sending unauthorized");
        socket.emit("unauthorized");
    }
    else
    {
        console.log("preloading query"); 
        // PRELOAD QUERY
    }

    // OTHER QUERY LISTENERS HERE

    socket.on('disconnect', function(){
        delete authenticated[socket.id];
        console.log(socket.id,"deleted");
    });
});

io.use(function(socket, next){
    if (socket.handshake.query.u !== 'null' && socket.handshake.query.u !== undefined)
    {
        authenticated[socket.id] = {};
        authenticated[socket.id].user = socket.handshake.query.u;
        authenticated[socket.id].group = socket.handshake.query.g;
        console.log("authenticated updated ==>",authenticated);
    }
    if (socket.request.headers.cookie) return next();
    next(new Error('Authentication error'));
});

這是我適用的客戶代碼

<!DOCTYPE html>
<html>
<head>
<title>Query Page</title>
<link rel="icon" href="favicon.ico" sizes="32x32" type="image/ico">
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script src="https://cdn.socket.io/socket.io-1.3.5.js"></script>
<script>
var socket = io.connect("127.0.0.1/query",{query:"u=" + readCookie("u") + "&g=" + readCookie("g")});

我顯然缺少了一些東西。 另外,我是node和socket.io的新手,希望能獲得任何指導。

編輯:將編輯更改為答案。

還將客戶端連接從“ example.com”更改為服務器的IP地址。 雖然,我懷疑這很重要,但我想知道問題是否與我的DNS重定向URL有關。

根目錄“命名空間”雖然不像我那樣起作用。

更改

var index = io.of('/').on('connection', function (socket) {

var index = io.of('/index').on('connection', function (socket) {

因此,實際的索引頁將不依賴於默認的名稱空間,而是擁有自己的模塊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM