使用socket.io和express的多个唯一客户端

时间:2012-03-29 15:19:10

标签: javascript node.js express socket.io

我正在使用socket.io和express,我正在努力寻找所有发送和接收来自服务器的消息的唯一页面。

当我按照大多数教程进行操作时,服务器脚本的开头是这样的:

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');
});

我可以在localhost:8080测试我的客户端应用程序。但我想要的是运行多个客户端应用程序,例如http://localhost:8080/myApp/client1.htmlhttp://localhost:8080/myApp/client2.html。当我尝试这个时,它会返回如下内容:

Cannot GET /myApp/client1.html

我的目标是拥有两个或更多可以通过套接字相互发送消息的唯一页面。任何帮助是极大的赞赏。我现在已经把这个问题拖了很长时间。

2 个答案:

答案 0 :(得分: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以获取更好的示例。

答案 1 :(得分: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]);
});