2011-07-25 201 views
7

我開始玩node.js,和大家一樣,我想聊天。node.js socket.io簡單聊天

我的想法是運行node.js與端口9090中的socket.io,例如,我的客戶端html 8080端口。我的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中的文件夾中。

有什麼問題?

+0

查找到這一點,你有類似的問題https://stackoverflow.com/questions/48198835/socket-io-404 -error/48255983#48255983 –

回答

0

您不能向與當前頁面不在同一主機名和端口上的URL發出AJAX請求。這是所有網絡瀏覽器的安全限制。

5

您的客戶端代碼實際上並不是根據您的需要從端口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)。

3

當我將客戶端更新爲:

<!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> 

一切工作。

我使用的版本,這是問題的socket.io的0.7:https://github.com/LearnBoost/Socket.IO/wiki/Migrating-0.6-to-0.7

+0

當我使用/socket.io/socket.io.js和io.connect(「http:// ipaddress」,{port:8080})時,它起作用。 node.js顯然會自動爲js文件服務,當我使用主機的IP而不是本地主機時,它會繞過原始限制。 –