##聊天室例子
提示:readline promat()解释
http://blog.csdn.net/zgljl2012/article/details/48321171
**server.js**
```js
// 建立一个Socket服务端
const net = require('net');
// 用于存储所有的连接
var clients = [];
var server = net.createServer(function(socket) {
// socket.setEncoding('utf8');
// 哪个客户端与我连接socket就是谁
clients.push(socket);
console.log("Welcome " + socket.remoteAddress + " to 2080 chatroom");
// 触发多次
socket.on('data', clientData).on('error', function(err) {
clients.splice(clients.indexOf(socket), 1);
console.log(socket.remoteAddress +"下线了 当前在线" + clients.length);
});
});
// 广播消息
function boardcast(signal) {
// console.log(signal);
// 肯定有用户名和消息
var username = signal.from;
var message = signal.message;
// 我们要发给客户端的东西
var send = {
procotol: signal.procotol,
from: username,
message: message
};
// 广播消息
clients.forEach(function(client) {
client.write(JSON.stringify(send));
});
}
// 有任何客户端发消息都会触发
function clientData(chunk) {
// chunk:boardcast|张三|弄啥咧!
// chunk:{"procotol":"boardcast","from":"张三","message":"弄啥咧!"}
// chunk:{"procotol":"p2p","from":"张三","to":"李四","message":"弄啥咧!"}
try {
var signal = JSON.parse(chunk.toString().trim());
var procotol = signal.procotol;
switch (procotol) {
case 'boardcast':
boardcast(signal);
break;
// case 'p2p':
// p2p(signal);
// break;
// case 'shake':
// shake(signal);
// break;
default:
socket.write('弄啥咧!你要干的我干不了');
break;
}
} catch (error) {
socket.write('弄啥咧!');
}
}
var port = 2080;
server.listen(port, function(err) {
if (err) {
console.log('端口被占用');
return false;
}
console.log("服务端正常启动监听【" + port + "】端口");
});
```
**client.js**
```js
// 客户端
const net = require('net');
const readline = require('readline');
const rl = readline.createInterface(process.stdin, process.stdout);
rl.question('What is your name? ', function(name) {
name = name.trim();
if (!name) {
throw new Error('没名字还出来混。。');
}
// 创建于服务端的连接
var server = net.connect({ port: 2080, host: '192.168.xx.xx' }, () => {
console.log("Welcome " + name + " to 2080 chatroom");
// 监听服务端发过来的数据
server.on('data', function(chunk) {
try {
var signal = JSON.parse(chunk.toString().trim());
var procotol = signal.procotol;
switch (procotol) {
case 'boardcast':
console.log('\nboardcast[' + signal.from + ']> ' + signal.message + '\n');
rl.prompt();
break;
default:
server.write('弄啥咧!你要干的我干不了');
break;
}
} catch (error) {
server.write('弄啥咧!');
}
});
rl.setPrompt(name + '> '); // 此时没有写到控制台
rl.prompt(); // 写入控制台
// 输入一行内容敲回车
rl.on('line', function(line) {
// {"procotol":"boardcast","from":"张三","message":"弄啥咧!"}
var send = {
procotol: 'boardcast',
from: name,
message: line.toString().trim()
};
server.write(JSON.stringify(send));
rl.prompt();
});
rl.on('close', function() {
// console.log('Have a great day!');
// process.exit(0);
});
});
});
```
- 简介
- 配置安装
- window
- 基础知识
- Node 命令基本用法
- 进程和线程
- 调试
- 异步、回调
- 全局对象
- 非阻塞 I/O和事件驱动和非阻塞机制
- npm包概念
- 模块化
- 实现require和cache
- 核心模块操作
- fs文件系统操作
- 同步调用和异步调用
- 缓冲区处理(二进制数据)
- 文件读取
- 文件写入
- 例子:读取歌词文件显示
- 文件流
- 例子:文件复制
- 监视文件
- 其他文件操作
- 目录操作
- 例子:递归加载目录树
- path路径操作模块
- 网络操作
- URL 解析模块
- querystring查询字符串模块
- crypto加密解密模块
- Socket
- 例子:聊天室
- coffeescript
- Gulp-自动化构建工具
- Gulp实现前端构建
- Gulp后端构建
- 插件
- gulp-load-plugins 模块化管理插件
- gulp-minify-css 压缩css插件
- gulp-sass 将sass预处理为css
- gulp-less 将less预处理为css
- gulp-sourcemaps 插件
- gulp-concat 合并插件
- gulp-uglify 压缩JS插件
- gulp-util gulp常用工具库插件
- yargs插件
- gulp-nodemon 自动启动/重启插件
- coffee-script 插件
- gulp-coffee插件
- gulp-livereload 网页自动刷新
- Moment.js-处理时间插件
- express 前端框架
- Async-异步流程控制插件
- node-progress进度条插件
- JSHint-代码规范检查工具
- lodash -JavaScript 工具库
- 资料
- 框架所用包
- bodyParser