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/>


13 回复

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>

说明

  1. 服务端 (server.js):使用 express 创建 HTTP 服务器,并使用 socket.io 处理 WebSocket 连接。
  2. 客户端 (index.html):使用 HTML5 Canvas 绘制图形,并通过 Socket.IO 实时同步绘图数据。

注意事项

  • 上述代码仅为简化版,实际项目中还需要处理更多的细节,例如错误处理、安全性等。
  • 确保安装所需的依赖项,如 expresssocket.io

希望这可以帮助你理解并实现一个简单的多人协作绘图程序!

回到顶部