2012-08-11 34 views
15

Tôi có điều này Node.js máy chủ:Socket.IO chỉ hoạt động tại địa phương

var app = require('express')(); 
var server = app.listen(80); 
var io = require('socket.io').listen(server); 
var posx = 10; 
var posy = 10; 

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

io.sockets.on('connection', function (socket) { 
    socket.emit('start', { 
     x: posx, 
     y: posy 
    }); 

    socket.on('newpos', function (data) { 
     posx = data["x"]; 
     posy = data["y"]; 
     socket.broadcast.emit('move', { x: posx, y: posy }); 
    }); 
}); 

KHÁCH HÀNG PHỤ Mã sản phẩm:

  var socket = io.connect('http://localhost'); 

      socket.on('start', function (data) { 
       $("#pointer").animate({ 
        'top': data["y"], 
        'left': data["x"] 
       }, 0); 
      }); 

      socket.on('move', function (data) { 
       $("#pointer").animate({ 
        'top': data["y"], 
        'left': data["x"] 
       }, "slow"); 
      }); 

      $("#pointer").draggable({ 
       stop: function(event, ui) { 
        var pos = $("#pointer").position(); 

        socket.emit('newpos', { 
         'x': pos.left, 
         'y': pos.top 
        }); 
       } 
      }); 

Vấn đề là nó có vẻ là chỉ làm việc tại địa phương . On ubuntu chrome tôi nhận được:

XMLHttpRequest cannot load http://localhost/socket.io/1/?t=1344711676473. Origin http://192.168.1.130 is not allowed by Access-Control-Allow-Origin. 

Trong khi trên một mac, Tôi gặp một lỗi GET cho cùng một tập tin ...

Bất kỳ ý tưởng về những gì các vấn đề có thể được?

+0

Mã phía khách hàng của bạn là gì? – ebohlman

+0

vui lòng kiểm tra chỉnh sửa của tôi. –

Trả lời

32

Miền của trang web không phải thực hiện với vị trí được lưu trữ trên trang web, nó phải làm gì với URL bạn đang sử dụng để truy cập.

Ngay cả khi "192.168.1.130" và "localhost" giải quyết cho cùng một máy chủ, chúng được coi là các miền khác nhau.

Kết quả là, bởi vì bạn có mã phía khách hàng:

var socket = io.connect('http://localhost'); 

Bạn đang kết nối với miền localhost. Nếu mã máy khách được phục vụ bởi localhost thì bạn vẫn ổn, nhưng nếu bạn đang tải máy khách từ một miền khác (ví dụ 192.168.1.130) thì bạn sẽ gặp phải vấn đề. Từ quan điểm của trình duyệt và máy chủ, bạn có thể dễ dàng trở thành một người lạ hoàn toàn cố gắng truy cập dịch vụ đó.

Để khắc phục vấn đề thay đổi tạo ổ cắm phía khách hàng để:

var socket = io.connect('192.168.1.130');

Bạn nên có vấn đề của bạn được giải quyết.

Thật sự mặc dù, bạn chỉ nên loại bỏ các thông số hoàn toàn và thử chạy:

var socket = io.connect();

Bằng cách đó nó sẽ mặc định bất cứ điều gì miền bạn đang dựa trên, và nó sẽ làm việc cả trên localhost, IP và cuối cùng là tên miền bạn sử dụng.

+0

oh boy ... sooo stupid !!! hoàn toàn quên mất rằng ... câu hỏi của tôi là giá trị một xóa shah –

+8

Không có một sai lầm dễ dàng để thực hiện! Câu hỏi sẽ giúp người khác đối mặt với các vấn đề tương tự. – slifty

+1

Điều gì xảy ra nếu tôi cần chỉ định số cổng với var socket = io.connect(); bạn làm điều đó như thế nào? – Caimen

2

Thay đổi app.listen (80) thành app.listen (80, '192.168.1.130') để sử dụng IP đó, theo cách đó URL của bạn từ socket.io phải chính xác. Ngoài ra, hãy chắc chắn truy cập nó từ 192.168.1.130 trong trình duyệt của bạn ngay cả khi bạn thử trên máy cục bộ.

+0

không may mắn .. vẫn còn lỗi tương tự. Tôi cũng không nghĩ rằng nó là một ý tưởng tốt để đặt IP địa phương như tôi muốn máy chủ của tôi có thể truy cập từ bên ngoài mạng nội bộ của tôi. –

+0

thnx man đề xuất của bạn đã giải quyết được vấn đề của tôi :) – Mj1992

Các vấn đề liên quan