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

multiple unique clients using socket.io and express

本文关键字:唯一 客户端 express socket io 使用      更新时间:2023-09-26

我正在使用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.html和http://localhost:8080/myApp/client2.html.当我尝试此操作时,它会返回类似以下内容:

Cannot GET /myApp/client1.html

我的目标是拥有两个或多个唯一的页面,它们可以通过套接字相互发送消息。非常感谢您的帮助。我已经在这个问题上思考太久了。

我对Express不是很熟悉,但本能告诉我get()将引用get HTTP请求,因此不是websocket。我认为您应该使用Express为页面请求返回HTML,但实时数据传输将由Socket.io处理。

因此,您将有实际页面请求的Express退货:

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

同样,我不知道Express,所以我可能有语法错误,但我的要点是,有两件事需要分别处理。一个是返回实际的HTML页面,另一个是加载页面之间的实时数据通信。我的例子很粗糙,请查看Socket.io Readme以获得一些更好的例子。

或为文件添加一个动态处理程序:

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