我正在使用node.js和socket.io
开发多用户绘图应用我在node.js上使用express web framework
var express = require("express"),
http = require("http");
var hoganex = require('hogan-express');
var app = express(),
server = http.createServer(app)
io = require('socket.io').listen(server);
var routes = require('./routes');
var app = express({
views: path.join(__dirname, 'views')
});
app.set('views', __dirname + '/views');
app.set('view engine', 'html');
app.set('layout', 'layout.html');
app.engine('html', hoganex);
app.get('/test', routes.index);
app.use(express.static(__dirname + '/assets'));
// Listen for incoming connections from clients
io.sockets.on('connection', function (socket) {
//code for collaboration goes here using socket.on and other methods for sending...
});
我想做一些与etherpad和togetherjs类似的事情。每当用户访问webapp时,都会向他提供该应用程序的新实例,现在他可以共享某种操纵或任意其他随机生成的url,通过这种方式,他可以连接其他用户/同伴,以便他们可以协作他们的工作,在我看来是协作绘图。
所以问题是如何实现这一目标。将相同的index
页面呈现给每个新传入的用户,然后为他提供共享某种URL的功能,以便与该特定URL相关的用户能够使用sockrt.io协作他们的工作并继续执行该过程。其他n
个用户与其他m
用户协作完成工作。
答案 0 :(得分:3)
你应该看看Etherdraw。它完全按照您使用Node.js和socket.io描述的内容。
当用户访问您的网站时,我们称之为draw.yoursite.com,在数据存储区中创建一个新的唯一room_id,并将用户发送到空白画布。当用户绘制时,通过socket.io将绘图数据(即行的类型,行开始(x,y),行结束(x,y))发送到服务器。数据存储在数据存储区中,并发布给订阅该房间的所有用户(pub / sub)。
当新用户请求房间(draw.yoursite.com/ [room_id])时,将查询数据存储。 (默认情况下,Etherdraw将数据以JSON格式存储在flatfile中,但建议将MongoDB之类的东西用于测试以外的任何其他内容。)
如果请求的房间已经存在,请发回该房间的数据。图纸作为(x,y)坐标存储在数据存储区中,其中的属性描述了如何连接点(即直线,粗体,弧形等)。