【问题标题】:node.js socket.io simple chatnode.js socket.io 简单聊天
【发布时间】:2011-07-25 14:55:13
【问题描述】:

我开始玩 node.js,和大家一样,我想聊一聊。

例如,我的想法是在端口 9090 中运行带有 socket.io 的 node.js,在端口 8080 中运行我的客户端 html。我的 html 客户端将独立服务。

我的服务器:

var sys = require('sys');
var express = require('express');
var io = require('socket.io');

var app = express.createServer();

app.listen(8080);

var socket = io.listen(app);

socket.on('connection', function (client) {
    client.on('message', function (msg) {
        socket.broadcast(msg);
    });
    client.on('disconnect', function () {
    });
});

我的客户:

<!DOCTYPE html>
<html>
    <head>
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
        <script src="http://cdn.socket.io/stable/socket.io.js"></script>
        <script>
            $(document).ready(function () {
                var socket = new io.Socket("localhost", {port: 8080});

                socket.on('connect', function () {
                    socket.send('A client connected.');
                });
                socket.on('message', function (message) {
                    $('div#messages').append($('<p>'), message);
                });
                socket.on('disconnect', function () {
                    console.log('disconnected');
                });
                socket.connect();

                $('input').keydown(function (event) {
                    if(event.keyCode === 13) {
                        socket.send($('input').val());
                        $('input').val('');
                    }
                });
            });
        </script>
    </head>
    <body>
        <input type="text" style="width: 300px;" />
        <div id="messages" style="border:solid 1px #000;">&nbsp;</div>
    </body>
</html>

我在 ubuntu 11.04 中使用 node.js v0.4.10 运行。

服务器工作正常,但客户端无法连接,在谷歌浏览器的 console.log 中我收到以下消息: XMLHttpRequest 无法加载 http://localhost:8080/socket.io/xhr-polling//1311465961485。 Access-Control-Allow-Origin 不允许来源http://localhost

server.js 位于 /var/www/cliente/chat/public 的文件夹中。

有什么问题?

【问题讨论】:

标签: node.js socket.io


【解决方案1】:

您的客户端代码实际上并没有按照您的意愿从端口 8080 提供。

var sys = require('sys');
var express = require('express');
var io = require('socket.io');

var app = express.createServer();
app.listen(8080);
app.use(express.static(__dirname));

app.get('/', function(req, res){
    res.render('index.html', { title: 'Chat' });
});

var socket = io.listen(app);

socket.on('connection', function (client) {
    client.on('message', function (msg) {
        socket.broadcast(msg);
    });
    client.on('disconnect', function () {
    });
});

这应该可以解决您的 Access-Control-Allow-Origin 错误。执行node server.js 并连接到http://localhost:8080。一些附加说明:

  1. 确保您已经安装了 socket.io 0.6.x,因为这就是您在 html 文件中包含的内容。 0.7.x 向后不兼容。

  2. 使用此配置,您将在为页面提供服务的同一端口上运行 socket.io(而不是 9090)。

【讨论】:

    【解决方案2】:

    当我将客户端更新为:

    <!DOCTYPE html>
    <html>
        <head>
            <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
        <script src="http://localhost:8080/socket.io/socket.io.js"></script>
            <script>
                    var socket = io.connect("http://localhost", {port: 8080});
    
            socket.on('connect', function () {
                        socket.send('A client connected.');
                    });
    
                    socket.on('message', function (msg) {
                        $('div#messages').append($('<p>'), msg);
                    });
    
                    socket.on('disconnect', function () {
                console.log('disconnected');
                    });
    
            $(document).ready(function(){
                    $('#btn_send').click(function (event) {
                        socket.send($('#txt_msg').val());
                        $('#txt_msg').val('');
                });
                    });
            </script>
        </head>
        <body>
            <input type="text" id="txt_msg" style="width: 300px;" /><input type="button" id="btn_send" value="send" />  
            <div id="messages" style="border:solid 1px #000;">&nbsp;</div>
        </body>
    </html>
    

    一切正常。

    我使用的是 0.7 版的 socket.io,这就是问题所在:https://github.com/LearnBoost/Socket.IO/wiki/Migrating-0.6-to-0.7

    【讨论】:

    • 它在我使用时工作:/socket.io/socket.io.js 和 io.connect("ipaddress", {port: 8080})。 node.js 显然会自动提供 js 文件,当我使用主机 IP 而不是 localhost 时,它绕过了来源限制。
    【解决方案3】:

    您不能向与当前页面不在同一主机名和端口上的 URL 发出 AJAX 请求。这是所有网络浏览器的安全限制。

    【讨论】:

      猜你喜欢
      • 2015-06-17
      • 2016-05-06
      • 2014-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-11
      • 1970-01-01
      相关资源
      最近更新 更多