Nodejs协作绘图程序在线测试
Nodejs协作绘图程序在线测试
nodePaintChat - node.js开发的多人协作绘图程序 <br/> <br/>作者: hpf1908 (CNODEJS社区) <br/><div style=“display: inline !important;”> <br/><div style=“display: inline !important;”> <br/><div id=“profileMain” style=“display: inline !important;”> <br/><div style=“display: inline !important;”> <br/><div style=“display: inline !important;”> <br/><div id=“profileL” style=“display: inline !important;”> <br/><div id=“profileHead” style=“display: inline !important;”> <br/><div id=“profileHeadBg” style=“display: inline !important;”> <br/><div id=“other_info” style=“display: inline !important;”> <br/><div style=“display: inline !important;”><a href=“http://static.data.taobaocdn.com/up/nodeclub/2011/05/45e8bb70jw1dgy3pfck64j.jpg”><img class=“alignnone size-full wp-image-921” title=“45e8bb70jw1dgy3pfck64j” src=“http://static.data.taobaocdn.com/up/nodeclub/2011/05/45e8bb70jw1dgy3pfck64j.jpg” alt="" width=“440” height=“247” /></a></div> <br/></div> <br/></div> <br/></div> <br/></div> <br/></div> <br/></div> <br/></div> <br/></div> <br/></div> <br/> <br/> <br/><span style=“color: #ff0000;”><strong>演示地址:<a href=“http://paintchat.cnodejs.net/” target="_blank">http://paintchat.cnodejs.net/</a></strong></span> <br/><div id=“main”> <br/><div> <br/><div id=“slider”> <br/><div id=“readme”> <br/><div> <br/><img class=“alignnone” title=“http://ww1.sinaimg.cn/large/6cfc7910jw1dm30ua6k9lj.jpg” src=“http://ww1.sinaimg.cn/large/6cfc7910jw1dm30ua6k9lj.jpg” alt="" width=“1276” height=“683” /> <br/> <br/></div> <br/></div> <br/></div> <br/></div> <br/></div> <br/>
Node.js 协作绘图程序在线测试
nodePaintChat - Node.js 开发的多人协作绘图程序
作者: hpf1908 (CNODEJS社区)
演示地址:
您可以在这里访问在线演示:nodePaintChat
简介:
nodePaintChat
是一个使用 Node.js 构建的多人协作绘图应用程序。用户可以在同一个画布上绘制,并且能够实时看到其他用户的绘画动作。
技术栈:
- Node.js: 后端服务器处理逻辑。
- Socket.IO: 实现实时通信,使用户能够在不同设备上同步绘图操作。
- HTML5 Canvas: 前端用于绘制图形。
- Express.js: 作为 Web 框架来管理路由和请求。
示例代码:
以下是一个简化版的 nodePaintChat
的核心实现,包括后端服务器和前端页面的基本结构。
后端服务器 (server.js)
const express = require('express');
const http = require('http');
const socketIo = require('socket.io');
const app = express();
const server = http.createServer(app);
const io = socketIo(server);
app.get('/', (req, res) => {
res.sendFile(__dirname + '/index.html');
});
io.on('connection', (socket) => {
console.log('A user connected:', socket.id);
socket.on('draw', (data) => {
// 广播给所有连接的客户端
io.emit('draw', data);
});
socket.on('disconnect', () => {
console.log('User disconnected:', socket.id);
});
});
server.listen(3000, () => {
console.log('Server is running on port 3000');
});
前端页面 (index.html)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>nodePaintChat</title>
<style>
canvas {
border: 1px solid black;
}
</style>
</head>
<body>
<canvas id="drawingCanvas"></canvas>
<script src="/socket.io/socket.io.js"></script>
<script>
const canvas = document.getElementById('drawingCanvas');
const ctx = canvas.getContext('2d');
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
let drawing = false;
function startDraw(event) {
drawing = true;
draw(event);
}
function endDraw() {
drawing = false;
ctx.beginPath();
}
function draw(event) {
if (!drawing) return;
ctx.lineWidth = 5;
ctx.lineCap = 'round';
ctx.strokeStyle = '#000000';
ctx.lineTo(event.clientX - canvas.offsetLeft, event.clientY - canvas.offsetTop);
ctx.stroke();
ctx.beginPath();
ctx.moveTo(event.clientX - canvas.offsetLeft, event.clientY - canvas.offsetTop);
// 发送绘图数据到服务器
const data = {
x: event.clientX - canvas.offsetLeft,
y: event.clientY - canvas.offsetTop,
color: ctx.strokeStyle
};
socket.emit('draw', data);
}
const socket = io();
socket.on('draw', (data) => {
ctx.lineWidth = 5;
ctx.lineCap = 'round';
ctx.strokeStyle = data.color;
ctx.lineTo(data.x, data.y);
ctx.stroke();
ctx.beginPath();
ctx.moveTo(data.x, data.y);
});
canvas.addEventListener('mousedown', startDraw);
canvas.addEventListener('mouseup', endDraw);
canvas.addEventListener('mousemove', draw);
</script>
</body>
</html>
总结:
通过上述代码,我们实现了一个简单的多人协作绘图程序。后端使用 Node.js 和 Socket.IO 来处理实时通信,而前端则使用 HTML5 Canvas 进行绘图。用户可以在同一画布上协作绘制,并且所有的绘图操作都会实时同步到所有连接的客户端。
高端
非常好的协作体验。好像存在一个bug,当我打开两个页面时,一个页面重画的操作没有通知到另一个。
演示地址打不开!汗
很快将迁移到新的地址上去
我想知道,你的画图代码和聊天代码是如何结合到一起的,学习。 <br/> <br/>画板功能只能在safari上实现,在chrome上无法实现吗? <br/>draft的问题?
不好意思,在safari,chrome,firefox上均能实现,很强大。感谢分享。 <br/> <br/>源码在git上有发布吗?
我在git上找到了你的源码,下载下来运行提示 Cannot find module ‘connect-form’ <br/> <br/>这是express中的方法? <br/>我导入express为什么仍然显示这个错误? <br/> <br/>请指教
问题我以解决,在git上找到了一个connect-form包。导入后可以正常运行。 <br/> <br/>源码研究中。 <br/>感谢大侠。 <br/> <br/>有问题我回来请教。 <br/>希望给于帮助,谢谢
很棒,谢谢分享
请问应该使用哪个版本的node.js和express,最新版的貌似有问题啊
已经好了,在这里提一下,node.js版本最高4.12,再高不支持express2.3.2了,其他的缺什么包按什么包就可以 了,希望有所帮助
Node.js 协作绘图程序在线测试
描述
nodePaintChat
是一个基于 Node.js 开发的多人协作绘图程序。用户可以实时绘制图形并与其他人共享他们的绘图。
演示地址
你可以通过访问 http://paintchat.cnodejs.net/ 来查看该程序的在线演示。
技术栈
- 前端:HTML、CSS 和 JavaScript(可能使用了 Socket.IO 进行实时通信)
- 后端:Node.js、Express
- 数据库:可能使用 Redis 或其他存储方案来存储实时数据
示例代码
以下是一个简单的示例代码,展示了如何使用 Node.js 和 Socket.IO 实现基本的协作绘图功能。
// server.js
const express = require('express');
const http = require('http');
const socketIo = require('socket.io');
const app = express();
const server = http.createServer(app);
const io = socketIo(server);
app.get('/', (req, res) => {
res.sendFile(__dirname + '/index.html');
});
let drawingData = [];
io.on('connection', (socket) => {
console.log('A user connected:', socket.id);
// 发送当前的绘图数据给新连接的客户端
socket.emit('drawing-data', drawingData);
socket.on('draw-event', (data) => {
drawingData.push(data);
io.emit('draw-event', data);
});
socket.on('disconnect', () => {
console.log('User disconnected:', socket.id);
});
});
server.listen(3000, () => {
console.log('Server is running on port 3000');
});
<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Collaborative Drawing</title>
<style>
canvas { border: 1px solid black; }
</style>
</head>
<body>
<canvas id="drawingCanvas" width="800" height="600"></canvas>
<script src="/socket.io/socket.io.js"></script>
<script>
const socket = io();
const canvas = document.getElementById('drawingCanvas');
const context = canvas.getContext('2d');
let isDrawing = false;
function startDraw(event) {
isDrawing = true;
draw(event);
}
function endDraw() {
isDrawing = false;
context.beginPath();
}
function draw(event) {
if (!isDrawing) return;
context.lineWidth = 5;
context.lineCap = 'round';
context.strokeStyle = '#000';
context.lineTo(event.offsetX, event.offsetY);
context.stroke();
context.beginPath();
context.moveTo(event.offsetX, event.offsetY);
socket.emit('draw-event', {
x: event.offsetX,
y: event.offsetY
});
}
canvas.addEventListener('mousedown', startDraw);
canvas.addEventListener('mouseup', endDraw);
canvas.addEventListener('mouseout', endDraw);
canvas.addEventListener('mousemove', draw);
socket.on('draw-event', (data) => {
context.lineWidth = 5;
context.lineCap = 'round';
context.strokeStyle = '#000';
context.lineTo(data.x, data.y);
context.stroke();
context.beginPath();
context.moveTo(data.x, data.y);
});
socket.on('drawing-data', (data) => {
data.forEach(drawPoint);
});
function drawPoint(point) {
context.lineWidth = 5;
context.lineCap = 'round';
context.strokeStyle = '#000';
context.lineTo(point.x, point.y);
context.stroke();
context.beginPath();
context.moveTo(point.x, point.y);
}
</script>
</body>
</html>
说明
- 服务端 (
server.js
):使用express
创建 HTTP 服务器,并使用socket.io
处理 WebSocket 连接。 - 客户端 (
index.html
):使用 HTML5 Canvas 绘制图形,并通过 Socket.IO 实时同步绘图数据。
注意事项
- 上述代码仅为简化版,实际项目中还需要处理更多的细节,例如错误处理、安全性等。
- 确保安装所需的依赖项,如
express
和socket.io
。
希望这可以帮助你理解并实现一个简单的多人协作绘图程序!