node.js socket.io简单聊天

node.js socket.io简单聊天,node.js,socket.io,Node.js,Socket.io,我开始玩node.js,和大家一样,我想聊天 例如,我的想法是在端口9090中运行node.js和socket.io,在端口8080中运行我的客户端html。我的html客户端将独立提供服务 我的服务器: var sys = require('sys'); var express = require('express'); var io = require('socket.io'); var app = express.createServer(); app.listen(8080); v

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

例如,我的想法是在端口9090中运行node.js和socket.io,在端口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>

$(文档).ready(函数(){
var socket=new io.socket(“localhost”,{port:8080});
socket.on('connect',function(){
send('A client connected');
});
socket.on('message',函数(message){
$('div#messages')。追加($('p>'),message);
});
socket.on('disconnect',function(){
console.log('disconnected');
});
socket.connect();
$('input').keydown(函数(事件){
如果(event.keyCode===13){
send($('input').val());
$('input').val('');
}
});
});
我在ubuntu 11.04中运行node.js v0.4.10

服务器工作正常,但客户端无法连接。在google Chrome的console.log中,我收到以下消息: 无法加载XMLHttpRequest。访问控制不允许原点允许原点

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


有什么问题吗?

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

您的客户端代码实际上并没有按照您的要求从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 () {
    });
});
这将修复访问控制允许原点错误。执行node server.js并连接到。还有几点需要注意:

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

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


  • 当我将我的客户更新为:

    <!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>
    
    
    变量套接字=io.connect(“http://localhost“,{端口:8080});
    socket.on('connect',function(){
    send('A client connected');
    });
    socket.on('message',函数(msg){
    $('div#messages')。追加($('p>'),msg);
    });
    socket.on('disconnect',function(){
    console.log('disconnected');
    });
    $(文档).ready(函数(){
    $('btn_send')。单击(函数(事件){
    socket.send($('#txt_msg').val());
    $('#txt_msg').val('');
    });
    });
    
    一切顺利


    我使用的是socket.io的0.7版本,这就是问题所在:

    当我使用:/socket.io/socket.io.js和io.connect(“,{port:8080})时,它工作正常。node.js显然自动为js文件提供服务,当我将IP用于主机而不是本地主机时,它绕过了源限制