2012-04-17 59 views
10

Tôi đã nhìn chằm chằm vào các ví dụ node.js và socket.io tất cả các buổi chiều và tôi đang cố gắng để mảnh với nhau một trang đơn giản mà sẽ cho tôi biết có bao nhiêu người dùng tôi đã kết nối với máy chủ.nodejs socket.io không thể kết nối với máy chủ?

Tôi đã đọc tài liệu tại http://socket.io/ cũng như một số hướng dẫn/câu hỏi tại đây mô tả chính xác những gì tôi đang cố gắng làm. Tôi cũng đã tìm thấy create simple node js server and client không giúp tôi.

Thông tin Version:

Node.js - 0.6.15
nhanh - 3.0.0alpha1
socket.io - 0.9.5 (socket.io-client là phiên bản tương tự, tuy nhiên không tìm thấy tài nguyên ... xem ý kiến)
EJS - 0.7.1

đây là mã máy chủ của tôi:

var express = require('express'), 
    config = { 
     port: 4000, 
     hostname: 'localhost' 
    }; 

var server = module.exports = express.createServer(); 
    /* server configuration */ 
    server.use(express.cookieParser('keyboard unicorn')); 
    server.use(express.bodyParser()); 
    server.use(express.methodOverride()); 
    server.use(express.session({ secret: 'keyboard unicorn' })); 
    server.engine('.html', require('ejs').__express); 
    server.set('views', __dirname + '/lib/views'); 
    server.set('view options', { layout: false }); 
    server.set('view engine', 'html'); 
    server.use(server.router); 
    server.use('/', express.static(__dirname + '/lib/assets')); 

var io = require('socket.io').listen(server); 

var connections = { 'length': 0 }; 

io.sockets.on('connection', function(socket) { 
    socket.__fd = socket.fd; 
    connections[socket.__fd]=socket.remoteAddress; 
    ++connections.length; 
    console.log('user connected! There are a total of ' + connections.length + ' users online.'); 
    return socket.on('disconnect',function(){ 
     delete conns[socket.__fd]; 
     --connections.length; 
     console.log('user disconnected! There are a total of ' + connections.length + ' users remaining online.'); 
    }); 
}); 

server.get('/', function(req, res) { 
    res.render('index', { 
     'page_title': 'sample application', 
     'number_of_connections': connections.length 
    }); 
}); 

server.listen(config.port, config.hostname); 

Đây là mã khách hàng của tôi:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8"> 
    <title><%= page_title %></title> 
</head> 
<body> 
<div>There is a total of <%= number_of_connections %> user(s) connected.</div> 
<script src="http://cdn.socket.io/stable/socket.io.js"></script> 
<script type="text/javascript"> 
var socket = new io.Socket('localhost',{'port':4000}); 
socket.connect(); 
socket.on('connect', function() { 
    console.log('connected'); 
}); 
</script> 
</body> 
</html> 

Đây là những gì đang xảy ra khi tôi chạy máy chủ và kết nối với khách hàng.

$ node server.js 
    info - socket.io started 

khi tôi điều hướng đến máy chủ cục bộ: 4000 trên trình duyệt web của tôi Tôi nhận được trang có '0' (number_of_connections). Ngoài ra, tôi thấy không có gì trong thiết bị đầu cuối cho máy chủ (trên. '' Kết nối 'là không bao giờ trúng).

Trên máy khách, sau một hoặc hai giây, tôi bắt đầu nhận được một số lượng lớn các lỗi (nếu tôi rời khỏi giao diện điều khiển mở cho một vài giây nó bị treo trang) xem hình dưới đây:

enter image description here

Xin vui lòng, bất kỳ sự giúp đỡ với bắt đầu từ đâu để gỡ lỗi này sẽ được đánh giá tôi chỉ muốn để có được ví dụ cơ bản này lên và chạy để tôi có thể bắt đầu chơi với/hiểu nodejs và socket.io!

+0

Một nơi tốt để bắt đầu sẽ là phiên bản nút và phiên bản socket.io của bạn. Tôi thấy phiên bản của cdn.socket.io trong 0.6. Tôi thấy rằng tôi đang sử dụng socket.io 0.8.7 với nút v0.6.4, ví dụ. Ngoài ra, có một lý do bạn không chỉ cần đi với ''? Bạn có thể thử và xem kết quả có khác không (vì điều đó sẽ bỏ qua khả năng xảy ra lỗi phiên bản) – Kato

+0

'Không tải được tài nguyên: máy chủ trả lời với trạng thái 404 (Không tìm thấy) http: // localhost: 4000/socket.io/socket.io.js' – rlemon

+0

Hm, thật kỳ quặc. Tôi làm việc ra khỏi hộp, tất nhiên, vì vậy tôi không thể giúp đỡ nhiều về lý do tại sao bạn không thể sử dụng URL socket.io địa phương. Btw, phiên bản socket.io-client của tôi là 0.8.7 (giống như socket.io's) - tự hỏi nếu có vấn đề ... – Kato

Trả lời

14

Vấn đề là do Express hiện là một hàm.

Bạn cần phải làm như sau:

var express = require('express'); 
var app = express(); 
var server = app.listen(3000); 

var io = require('socket.io').listen(server); 
+0

@Linus G. Thiel đã chỉ cho tôi câu trả lời đúng, và tôi tin @tehlulz tình cờ gặp câu trả lời đúng nhưng đã đưa ra lý do sai. Tôi sẽ đề cập đến mã của @ tehlulz trong nhận xét này. Có vẻ như trong Express 3.0.x, bản thân ứng dụng, cho dù nó được tạo bằng 'express.createServer()' hay 'express()', không chứa đủ thông tin để cho phép Socket.IO nghe trực tiếp. Thay vào đó, nó là giá trị trả về của 'app.listen (PORT)' đó là những gì Socket.IO nên lắng nghe, chứ không phải là 'app'. – btown

+0

Tôi đã có chính xác cùng một vấn đề và giải pháp này làm việc cho tôi. 1 cho câu trả lời tuyệt vời – lhk

+1

Quá xấu này không được đánh dấu là câu trả lời. Đây là cách để có được express 3.0 để làm việc với socket.io – Benny

4

Express 3.0.0alpha and socket .io không phải là (trực tiếp) tương thích, do những thay đổi trong Express giữa 2. * và 3. * (hay đúng hơn, thay đổi trong Connect giữa 1. * và 2. *). Tôi khuyên bạn nên hạ cấp xuống Express 2.5.9 trong thời gian này hoặc bạn có thể theo dõi this advice từ tác giả Express ', TJ Holowaychuk.

+0

cool. Tôi sẽ cố gắng này, thankyou rất nhiều. – rlemon

4

Tôi thiết lập môi trường thử nghiệm, cài đặt nhanh 3.0 và socket.io 0.9.5 và sao chép lỗi của bạn.

Sau đó, tôi chạy npm install [email protected] đã thực hiện một vài chỉnh sửa ngược dựa trên migration guide và hoạt động tốt.

Vì vậy, tôi sẽ tiếp tục và đề xuất rằng socket.io có lẽ không tương thích với tốc độ 3 nhưng vẫn trông khá không ổn định.

app.js My tinh chỉnh cho nhanh 2:

var express = require('express'), 
    config = { 
    port: 8080, 
    hostname: 'localhost' 
}; 

var server = module.exports = express.createServer(); 
/* server configuration */ 
server.set('views', __dirname + '/lib/views'); 
server.set('view options', { layout: false }); 
server.set('view engine', 'ejs'); 
//server.register('.html', 'ejs');require('ejs').__express); 
server.use(express.cookieParser('keyboard unicorn')); 
server.use(express.bodyParser()); 
server.use(express.methodOverride()); 
server.use(express.session({ secret: 'keyboard unicorn' })); 
server.use('/', express.static(__dirname + '/lib/assets')); 
server.use(server.router); 

var io = require('socket.io').listen(server); 

io.set('log level', 2); 

var connections = { 'length': 0 }; 

server.get('/', function(req, res) { 
     res.render('index', { 
       'page_title': 'sample application', 
        'number_of_connections': connections.length 
        }); 
    }); 

io.sockets.on('connection', function(socket) { 
     socket.__fd = socket.fd; 
     connections[socket.__fd]=socket.remoteAddress; 
     ++connections.length; 
     console.log('user connected! There are a total of ' + connections.length + ' users online.'); 
     return socket.on('disconnect',function(){ 
       delete conns[socket.__fd]; 
       --connections.length; 
       console.log('user disconnected! There are a total of ' + connections.length + ' users remaining online.'); 
      }); 
    }); 

server.listen(config.port); 

chỉ số của tôi.ejs file:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8"> 
    <title><%= page_title %></title> 
</head> 
<body> 
<div>There is a total of <%= number_of_connections %> user(s) connected.</div> 
<!--<script src="http://cdn.socket.io/stable/socket.io.js"></script>--> 
<script src='/socket.io/socket.io.js'></script> 
<script type="text/javascript"> 
    var socket = io.connect('http://hostname.com:8080'); 
    socket.on('connect', function() { 
     console.log('connected'); 
    }); 
</script> 
</body> 
</html> 

Tôi hy vọng điều gì đó ở đây sẽ hữu ích.

+0

wow, trả lời hữu ích đáng kinh ngạc. Tôi ước tôi có thể upvote bạn hai lần! Tôi sẽ chuyển đổi cài đặt của tôi và hy vọng điều này cũng khắc phục vấn đề cho tôi! – rlemon

+0

Tôi đã thực hiện thay đổi mà bạn đã đề xuất và tinh chỉnh ứng dụng của tôi một chút để làm cho nó tương thích với phiên bản cũ hơn ... bây giờ tôi đang nhận được 'cảnh báo - không biết vận chuyển:" undefined "\ n info - unhandled socket.io url' – rlemon

+0

s/\ n/ngắt dòng – rlemon

0

thay app.use(express.bodyParser());, với

app.use(express.json()); 
app.use(express.urlencoded()); 

... Nghĩa là lưu tập tin, khởi động lại máy chủ node.

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