2015-02-01 13 views
10

Tôi gặp phải lỗi vận chuyển khi sử dụng socket.io v1.3.2. Nó chỉ có nghĩa là một thử nghiệm cho socket.io vì vậy tôi có thể làm quen với nó.Lỗi bỏ phiếu khi vận chuyển với Socket.Io

Tôi có một tập tin app.js (lấy trực tiếp từ tài liệu socket.io):

var app = require('http').createServer(handler); 
var io = require('socket.io')(app); 
var fs = require('fs'); 

app.listen(3000); 

function handler (req, res) { 
    fs.readFile(__dirname + '/index.html', 
    function (err, data) { 
    if (err) { 
     res.writeHead(500); 
     return res.end('Error loading index.html'); 
    } 

    res.writeHead(200); 
    res.end(data); 
    }); 
} 

io.on('connection', function (socket) { 
    socket.emit('news', { hello: 'world' }); 
}); 

Và một file index.html:

<!DOCTYPE html> 
<html> 
<head> 
    <meta http-equiv="X-UA-Compatible" content="IE=edge"> 
    <title></title> 
    <link rel="stylesheet" href=""> 
</head> 
<body> 
    <h1>Socket Test</h1> 
    <script src="/socket.io/socket.io.js"></script> 
    <script> 
     var socket = io.connect('http://localhost'); 
     socket.on('news', function (data) { 
      console.log(data); 
     }); 
    </script> 

</body> 
</html> 

Trong giao diện điều khiển, tôi nhận được lỗi sau:

GET http://localhost/socket.io/?EIO=3&transport=polling&t=1422782880286-40 
(index):1 XMLHttpRequest cannot load http://localhost/socket.io/?EIO=3&transport=polling&t=1422782880286-40. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access. The response had HTTP status code 404. 
socket.io.js:3715 engine.io-client:socket socket error {"type":"TransportError","description":0} +37ms 
socket.io.js:1402 socket.io-client:manager connect_error +38ms 
socket.io.js:1402 socket.io-client:manager reconnect attempt error +1ms 
socket.io.js:1402 socket.io-client:manager will wait 5000ms before reconnect attempt +0ms 
socket.io.js:3715 engine.io-client:socket socket close with reason: "transport error" +2ms 
socket.io.js:3715 engine.io-client:polling transport not open - deferring close +1ms 
socket.io.js:1402 socket.io-client:manager attempting reconnect +5s 
socket.io.js:1402 socket.io-client:manager readyState closed +0ms 
socket.io.js:1402 socket.io-client:manager opening http://localhost +0ms 
socket.io.js:3715 engine.io-client:socket creating transport "polling" +5s 
socket.io.js:3715 engine.io-client:polling polling +0ms 
socket.io.js:3715 engine.io-client:polling-xhr xhr poll +0ms 
socket.io.js:3715 engine.io-client:polling-xhr xhr open GET: http://localhost/socket.io/?EIO=3&transport=polling&t=1422782885332-41 +1ms 
socket.io.js:3715 engine.io-client:polling-xhr xhr data null +0ms 
socket.io.js:3715 engine.io-client:socket setting transport polling +1ms 
socket.io.js:1402 socket.io-client:manager connect attempt will timeout after 20000 +3ms 

Có ai biết cách sửa lỗi này không. Tôi đã tìm thấy this discussion, nhưng không thể giải quyết được vấn đề.

Trả lời

21

Sự khác biệt giữa mã của bạn và mẫu trên trang web socket.io là mã ví dụ socket.io đang nghe trên cổng 80 và kết nối webSocket trên cổng 80. Bạn đang nghe trên cổng 3000, nhưng cố gắng kết nối cổng 80, do đó kết nối không hoạt động. io.connect('http://localhost'); không chỉ định số cổng để nó sẽ sử dụng cổng http mặc định là cổng 80. Tuy nhiên, máy chủ websocket của bạn không nghe trên cổng 80 để kết nối không thành công.

Cách đơn giản nhất để khắc phục điều này là thay đổi dòng mã trong các khách hàng từ này:

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

này:

var socket = io.connect(); 

Khi bạn bỏ qua URL, nó sẽ, theo mặc định, sử dụng tên miền và cổng từ trang web hiện tại (đó là những gì bạn muốn).

1

theo mặc định, cổng máy chủ cục bộ là 80. bạn đã kết nối ổ cắm của máy khách với máy chủ cục bộ mà không khai báo cổng. do đó, nó cung cấp cho bạn cổng 80 theo mặc định và máy chủ nút của bạn đang nghe cổng 3000. để khách hàng của bạn kết nối với máy chủ của bạn, bạn phải khai báo cổng mà máy chủ lắng nghe. ví dụ: var socket = io.connect ('http://localhost:3000');

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