个人NodeJS小应用——AirBoard
个人NodeJS小应用——AirBoard
http://www.ctshare.com:8080 学习Web开发一个月的个人作品,基于NodeJS、MongoDB、Socket.IO 一个简单的实时白板应用
欢迎大家吐槽,如果觉得有一定应用价值,可能会重构开发 代码还比较烂,重构后开源,要是觉得没啥用处,就直接放源咯
2012-10-27 能抽出的时间比较少,直接放代码了,欢迎大家吐槽: https://github.com/imeoer/Air-Board-v1
个人NodeJS小应用——AirBoard
大家好!今天给大家介绍一个我最近开发的小应用——AirBoard。这是一个基于Node.js、MongoDB以及Socket.IO的简单实时白板应用。
应用简介
AirBoard是一个简单的在线协作工具,允许用户在一个共享画布上进行绘画。它使用WebSocket技术来实现实时通信,使得多个用户可以在同一个画布上同时绘制内容。通过这个应用,你可以与远程的朋友或同事一起工作,非常适合远程协作和教学场景。
技术栈
- Node.js: 后端服务器框架。
- MongoDB: 数据库用于存储用户信息和绘制的数据。
- Socket.IO: 实现客户端和服务器之间的实时双向通信。
示例代码
首先,我们需要安装必要的依赖包:
npm install express socket.io mongodb
接下来,创建一个基本的Express服务器,并配置Socket.IO:
const express = require('express');
const http = require('http');
const socketIo = require('socket.io');
const MongoClient = require('mongodb').MongoClient;
const app = express();
const server = http.createServer(app);
const io = socketIo(server);
// MongoDB 连接
const url = 'mongodb://localhost:27017';
const dbName = 'airboard';
MongoClient.connect(url, { useNewUrlParser: true, useUnifiedTopology: true }, (err, client) => {
if (err) throw err;
console.log("Connected successfully to server");
const db = client.db(dbName);
// 监听连接事件
io.on('connection', (socket) => {
console.log('A user connected');
socket.on('draw', (data) => {
// 存储绘制数据到数据库
db.collection('drawings').insertOne(data, (err, result) => {
if (err) throw err;
console.log('Drawing saved');
});
// 广播给所有连接的客户端
socket.broadcast.emit('drawing', data);
});
});
server.listen(8080, () => {
console.log('Server is running on port 8080');
});
});
使用说明
- 访问
http://www.ctshare.com:8080
来查看应用。 - 每个用户都可以在共享画布上绘制内容。
- 绘制的内容会实时同步到所有连接的客户端。
未来计划
目前这个应用还处于初级阶段,代码可能不够优雅。如果大家觉得这个应用有实际的应用价值,我会考虑重构并将其开源。如果大家有更好的建议或发现任何问题,欢迎在GitHub上提交issue或PR,我会尽快处理。
结语
希望大家喜欢这个小应用!如果有任何疑问或建议,请随时留言。期待大家的反馈!
项目地址
希望这段内容对你有所帮助!如果你有任何进一步的问题,请随时告诉我。
界面挺好看的,第一眼感觉良好,似乎很专业
非常好
UI设计不错~
看着还不错,期待开源学习…
界面看着很舒服,期待学习一下。
:) 美工控~
如果觉得有些应用价值就完善下再开源,木有的话就直接开源啦 :)
有用到express和ejs么?对了白板编辑用的是什么呢?
对了,楼主问个问题,你的程序是托管在自己的机子上还是远程空间上的?现在有哪些空间支持nodejs以及websocket么?收费也行…
用了express,模板用的是jqtpl,白板编辑用的是百度的ueditor
用的是59互联的vps哈,vps上可以自己随意配置咯
请问,弹框用的是什么插件啊?
不错~界面有看头~
挺好的尝试,支持!
界面做得很清爽,楼主开源之后,研究下源码。哈哈
做得不错. 前不久看到国外有一款类似的应用的. 未来可以和其他的办公应用整合.
比如和我们的everydo.com进行整合.
弹框是leanModal插件,代码没有压缩 可以自己看看哈 这应用是年初写的,那会刚学Javascript,感觉写得挺烂的 :)
多谢支持啦~~
谢谢 :)
哈,代码量很少,写的也比较烂,得空了重构后开源 :)
嗯,我去好好研究下,重构后尽量能有应用价值.
快大四了,有意向找工作,简历已发 :)
谢谢 :)
Thanks~ :)
问一下网站是部署在哪里的?
59互联的vps
很不错,支持一下!
兄弟 你那个东东注册不了 我在苹果下用的firefox 所以无法测试
对了 你是四川的? 我们是做移动游戏的 服务端用nodejs 特别是一些realtime的功能用的websocket,你要是有兴趣 咱们好好聊聊
我邮箱哈:imeoer@gmail.com
效果不错,不过为什么我一直无法注册呢~~~
同无法注册~
看看这个产品:
无法注册,代码共享下吧
服务器问题,已修复 :)
服务器问题,已修复 :)
服务器问题,已修复 :)
服务器问题,已修复 :) ,重构后开源~
嗯 服务器问题,已修复 :) 之前体验过很多同步类产品,AB也有相似之处
metro界面…LZ发到WIN8应用商店吧
做得不错。。。。至少界面很好看。哈哈哈。
恩 挺好挺好 楼主大四的作品算是挺牛了
再问一下 楼主的界面有用什么库吗?
没有哈,其实不多的,css写得比较少
好厉害! 什么时候开源?
期待开源
已开源 :)
“个人NodeJS小应用——AirBoard” 这个帖子介绍的是一个基于Node.js和MongoDB的简单实时白板应用。用户可以通过Socket.IO实现实时通信,从而共享同一个画布。
示例代码
1. 启动服务器 (server.js)
const express = require('express');
const http = require('http');
const socketIo = require('socket.io');
// 创建 Express 应用
const app = express();
// 创建 HTTP 服务器
const server = http.createServer(app);
// 将 Socket.IO 链接到 HTTP 服务器
const io = socketIo(server);
app.get('/', (req, res) => {
res.sendFile(__dirname + '/index.html');
});
io.on('connection', (socket) => {
console.log('New client connected');
socket.on('new-drawing', (data) => {
// 广播新的绘画数据给所有连接的客户端
socket.broadcast.emit('drawing-update', data);
});
socket.on('disconnect', () => {
console.log('Client disconnected');
});
});
server.listen(8080, () => {
console.log('Server is running on port 8080');
});
2. 客户端代码 (index.html)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>AirBoard</title>
<style>
canvas { border: 1px solid black; }
</style>
</head>
<body>
<canvas id="whiteboard"></canvas>
<script src="/socket.io/socket.io.js"></script>
<script>
const canvas = document.getElementById('whiteboard');
const ctx = canvas.getContext('2d');
let drawing = false;
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
const socket = io();
function startDrawing(e) {
drawing = true;
draw(e);
}
function stopDrawing() {
drawing = false;
ctx.beginPath();
}
function draw(e) {
if (!drawing) return;
ctx.lineWidth = 5;
ctx.lineCap = 'round';
ctx.strokeStyle = '#000';
ctx.lineTo(e.clientX - canvas.offsetLeft, e.clientY - canvas.offsetTop);
ctx.stroke();
ctx.beginPath();
ctx.moveTo(e.clientX - canvas.offsetLeft, e.clientY - canvas.offsetTop);
socket.emit('new-drawing', {
x: e.clientX - canvas.offsetLeft,
y: e.clientY - canvas.offsetTop
});
}
canvas.addEventListener('mousedown', startDrawing);
canvas.addEventListener('mouseup', stopDrawing);
canvas.addEventListener('mousemove', draw);
canvas.addEventListener('mouseout', stopDrawing);
socket.on('drawing-update', (data) => {
ctx.lineTo(data.x, data.y);
ctx.stroke();
ctx.beginPath();
ctx.moveTo(data.x, data.y);
});
</script>
</body>
</html>
说明
server.js
是一个简单的Node.js服务器,使用Express来处理HTTP请求,并通过Socket.IO实现实时通信。index.html
是客户端页面,它包含一个Canvas元素用于绘制。它监听鼠标事件,并通过Socket.IO发送绘制的数据到服务器,再由服务器广播给其他客户端。- 这只是一个基本的示例,实际项目可能需要考虑更多的功能和优化,比如多用户认证、持久化存储等。