2012-03-29 66 views
0

我正在與socket.io和快遞,我努力與具有獨特的頁面,所有發送和接收來自服務器的消息。多個獨特的客戶端使用socket.io和快遞

當我跟大多數的教程,在服務器腳本開始時像這樣的東西:

var app = require('express').createServer() 
var io = require('socket.io').listen(app); 
var clients = {}; 

app.listen(8080); 

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

,我可以在本地主機測試我的客戶端應用程序:8080。但我想要的是運行多個客戶端應用程序,如http://localhost:8080/myApp/client1.htmlhttp://localhost:8080/myApp/client2.html。當我嘗試這一點,它返回類似:

Cannot GET /myApp/client1.html 

我的目標是有一個可以通過插座將消息發送到對方兩個或更多的獨特的網頁。任何幫助是極大的讚賞。現在我一直對此感到震驚。

回答

1

我對Express並不是很熟悉,但本能告訴我get()會引用GET HTTP請求,因此不是websocket。我認爲你應該使用Express來爲頁面請求返回HTML,但是實時數據傳輸將由Socket.io來處理。

所以,你將有實際的頁面請求快速回報:

app.get('/myApp/client1.html', function(blah){}); 
app.get('/myApp/client2.html', function(blah){}); 

然後socket.io將處理說話:

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

io.sockets.on('connection', function (socket) { 
    socket.on('msg', function (data) { 
    io.sockets.emit('msg', {msg: data.msg}); 
    }); 
}); 

客戶:

var socket = io.connect('http://localhost:8080'); 
socket.on('msg', function (data) { 
    //code to add data.msg somewhere on page 
}); 
somebutton.on('click', function(e){ 
    socket.emit('msg', {msg:$(e.targetElement).value()}); 
}); 

同樣,我不知道快遞,所以我可能有語法錯誤,但我的要點是,你有兩個噸接下來你需要分開處理。一個是返回實際的HTML頁面,另一個是加載頁面之間的實時數據通信。我的例子很粗糙,請查看Socket.io Readme以獲取更好的示例。

+0

謝謝!你將我的注意力引向了正確的地方(app.get()的第一個參數)。這就是我需要解決我的問題。 – prototyper 2012-03-29 18:01:12

+0

我需要使用Express嗎?如果不是,我該如何替換express代碼以允許跨不同html頁面進行套接字通信? – prototyper 2012-04-03 18:03:30

+0

你不應該需要快速的套接字通信。我提供的例子是一個非常基本的聊天室,我主要從socket.io示例中複製它。你幾乎可以從socket.io網站複製這些例子,至少有一些事情可以從頭開始。 – 2012-04-03 18:30:31

1

或添加動態處理程序文件:

app.get('/myApp/:file', function(req, res) { 
    res.sendfile(__dirname+'/'+req.param('file')); 
}); 

或用正則表達式牛肉起來一點:

app.get(/^\/myApp\/(.+)\.html$/, function(req, res) { 
    res.sendfile(__dirname+'/'+req.params[0]); 
}); 
+0

嘿布拉德。我不確定我是否理解你的植入,但我認爲你現在正在處理我正在處理的問題。XHR的答案幫助我解決了最初的問題,但現在看起來好像我需要爲每個要加載的文件添加一個app.get()。我更喜歡更具活力的東西,我認爲這是你的建議,但我無法得到你的任何建議工作。我想我想要做的是請求myApp中的所有文件,以便我的HTML頁面可以從myApp加載任何它所需的內容,而無需在服務器腳本中爲每個文件添加請求。 – prototyper 2012-04-03 17:42:47

+0

這正是你可以用動態路線做的事情。當你嘗試做什麼時,什麼都不起作用?它可能只是一個實現細節。 – 2012-04-03 19:36:15

+0

它看起來像下面的腳本加載的HTML頁面,但HTML頁面引用的文件不。 //服務器腳本 var express = require('express'); var app = express.createServer(); var io = require('socket.io')。listen(app); app.listen(8080); app.get('/ myApp /:file',function(req,res){ res.sendfile(__ dirname +'/'+ req.param('file')); }); // HTML頁\t \t //或 prototyper 2012-04-03 20:37:12