GET http://js:port/socket.io/1/ 404 未找到

Posted

技术标签:

【中文标题】GET http://js:port/socket.io/1/ 404 未找到【英文标题】:GET http://js:port/socket.io/1/ 404 not found 【发布时间】:2014-01-16 06:24:47 【问题描述】:

Socket.io 无法连接。

这是我的服务器代码:

function chatserver()

var express = require('express'),

app = express(),

server = require('http').createServer(app).listen(app.get('port'),function()

        console.log('Express server listening on port '+ app.get('port'));
    );
var io = require('socket.io').listen(server),
    users = ;

io.sockets.on('connection', function(socket)
    socket.on('new user', function(data, callback)
        if (data in users)
            callback(false);
         else
            callback(true);
            socket.nickname = data;
            users[socket.nickname] = socket;
            updateNicknames();
        
    );

    function updateNicknames()
        io.sockets.emit('usernames', Object.keys(users));
    

    socket.on('send message', function(data, callback)
        var msg = data.trim();
        console.log('after trimming message is: ' + msg);
        if(msg.substr(0,3) === '/w ')
            msg = msg.substr(3);
            var ind = msg.indexOf(' ');
            if(ind !== -1)
                var name = msg.substring(0, ind);
                var msg = msg.substring(ind + 1);
                if(name in users)
                    users[name].emit('whisper', msg: msg, nick: socket.nickname);
                    console.log('message sent is: ' + msg);
                    console.log('Whisper!');
                 else
                    callback('Error!  Enter a valid user.');
                
             else
                callback('Error!  Please enter a message for your whisper.');
            
         else
            io.sockets.emit('new message', msg: msg, nick: socket.nickname);
        
    );

    socket.on('disconnect', function(data)
        if(!socket.nickname) return;
        delete users[socket.nickname];
        updateNicknames();
    );
);

我的 html 脚本代码:

jQuery(function($)

        var socket = io.connect('js/node_modules/socket.io/node_modules/socket.io-client/dist/socket.io.js');

        var $nickForm = $('#setNick');
        var $nickError = $('#nickError');
        var $nickBox = $('#nickname');
        var $users = $('#users');
        var $messageForm = $('#send-message');
        var $messageBox = $('#message');
        var $chat = $('#chat');

        $nickForm.submit(function(e)
            e.preventDefault();
            socket.emit('new user', $nickBox.val(), function(data)
                if(data)
                    $('#nickWrap').hide();
                    $('#contentWrap').show();
                 else
                    $nickError.html('That username is already taken!  Try again.');
                
            );
            $nickBox.val('');
        );

        socket.on('usernames', function(data)
            var html = '';
            for(i=0; i < data.length; i++)
                html += data[i] + '<br/>'
            
            $users.html(html);
        );

        $messageForm.submit(function(e)
            e.preventDefault();
            socket.emit('send message', $messageBox.val(), function(data)
                $chat.append('<span class="error">' + data + "</span><br/>");
            );
            $messageBox.val('');
        );

        socket.on('new message', function(data)
            $chat.append('<span class="msg"><b>' + data.nick + ': </b>' + data.msg + "</span><br/>");
        );

        socket.on('whisper', function(data)
            $chat.append('<span class="whisper"><b>' + data.nick + ': </b>' + data.msg + "</span><br/>");
        );
    );

当我第一次加载网站时,一切正常。但是,只要我单击聊天框,在检查元素/控制台中我就会看到出现 "GET http://'js':5001/socket.io/1/?.." 错误。请指教。

【问题讨论】:

尝试将客户端连接更改为io.connect(document.location.hostname) 【参考方案1】:

在服务器代码中,改变这个:

server = require('http').createServer(app).listen(port),

io = require('socket.io').listen(server),

var server = http.createServer(app).listen(app.get('port'), function()
  console.log('Express server listening on port ' + app.get('port'));
);

var io = require('socket.io').listen(server);

如果你在 http 服务器而不是 express.io 服务器,使用这个:

app.listen(app.get('port'), function()
   console.log("Express server listening on port " + app.get('port'));
);

【讨论】:

有趣。错误仍然存​​在,但控制台输出是“快速服务器侦听端口未定义”。知道为什么吗? 我的坦克很好用!【参考方案2】:

您的主要问题是客户端 Jquery 脚本。

var socket = io.connect('js/node_modules/socket.io/node_modules/socket.io-client/dist/socket.io.js');

socket.io.js 提供给客户端不是正确的方法。 你需要改成http://&lt;ip/domain&gt;:&lt;port&gt;/socket.io/socket.io.js

如果Socket.io 服务器正确侦听您的HTTP 服务器,它将自动通过http://&lt;ip/domain&gt;:&lt;port&gt;/socket.io/socket.io.js 为客户端文件提供服务。您无需在公共可访问文件夹中查找或复制为resources/js/socket.io.js 并手动提供。

代码示例 Express 3.x - Express 3 要求您实例化一个 http.Server 以将socket.io 附加到第一个

var express = require('express')
  , http = require('http');
//make sure you keep this order
var app = express();
var server = http.createServer(app);
var io = require('socket.io').listen(server);

//... 

server.listen(8000);

快乐编码:)

【讨论】:

以上是关于GET http://js:port/socket.io/1/ 404 未找到的主要内容,如果未能解决你的问题,请参考以下文章

使用 set; get; 而不是 get;放;

node 怎么获取get的参数

get请求

访问PHP发送多个get请求

method="GET" 给出空 $_GET,method="POST" 给出非空 $_GET。为啥? (PHP 5.6.6)

vue.js 中的 $http.get() 与 axios.get() 有啥区别?