node模块之net模块——socket
当我们去面试的时候,常常会遇到这样一个问题:当用户在浏览器地址栏输入一段url发出资源请求后,到服务端返回数据呈现给用户的这个过程都发生了什么?
我们把进行通信的这两个端(这里指的是,浏览器和资源获取的地方)称之为客户端和服务端。我们连通两个端进行通信,靠的就是socket这个东西。他将特定格式的内容进行传递,以达到客户端和服务端通信的目的。
最近刚好在学习node的net模块,接触到这一块内容。下面就来看看node中socket通信的一种实现方式。
client.js
// 客户端
const net = require('net');
const readline = require('readline');
const rl = readline.createInterface(process.stdin, process.stdout);
rl.question('What is your name? ', (name) => {
name = name.trim();
if (!name) {
throw new Error('名字没有提供');
}
// 创建于服务端的连接
var server = net.connect({ port: 2080, host: '192.168.1.56' }, () => {
console.log(`Welcome ${name} to 2080 chatroom`);
// 监听服务端发过来的数据
server.on('data', (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', (line) => {
// {"procotol":"boardcast","from":"张三","message":"你瞅啥!"}
var send = {
procotol: 'boardcast',
from: name,
message: line.toString().trim()
};
server.write(JSON.stringify(send));
rl.prompt();
})
.on('close', () => {
// console.log('Have a great day!');
// process.exit(0);
});
});
});
server.js
// 建立一个Socket服务端
const net = require('net');
// 用于存储所有的客户端连接
var clients = [];
var server = net.createServer((socket) => {
// socket.setEncoding('utf8');
// 哪个客户端与我连接socket就是谁
clients.push(socket);
console.log(`Welcome ${socket.remoteAddress} to 2080 chatroom 当前在线${clients.length}`);
// 触发多次
socket
.on('data', clientData)
.on('error', (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(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, (err) => {
if (err) {
console.log('端口被占用');
return false;
}
console.log(`服务端正常启动监听【${port}】端口`);
});
node模块之net模块——socket的更多相关文章
- 利用Node.js的Net模块实现一个命令行多人聊天室
1.net模块基本API 要使用Node.js的net模块实现一个命令行聊天室,就必须先了解NET模块的API使用.NET模块API分为两大类:Server和Socket类.工厂方法. Server类 ...
- Node.js的Formidable模块的使用
今天总结了下Node.js的Formidable模块的使用,下面做一些简要的说明. 1) 创建Formidable.IncomingForm对象 var form = new formidab ...
- Node.js的net模块
net模块提供了一个异步网络包装器,用于TCP网络编程,它包含了创建服务器和客户端的方法 创建TCP服务器 net.createServer方法 创建客户端去连接服务器 net.connect方法 简 ...
- node.js中ws模块创建服务端和客户端,网页WebSocket客户端
首先下载websocket模块,命令行输入 npm install ws 1.node.js中ws模块创建服务端 // 加载node上websocket模块 ws; var ws = require( ...
- node.js中net模块创建服务器和客户端(TCP)
node.js中net模块创建服务器和客户端 1.node.js中net模块创建服务器(net.createServer) // 将net模块 引入进来 var net = require(" ...
- node.js入门(二) 模块 事件驱动
模块化结构 node.js 使用了 CommonJS 定义的模块系统.不同的功能组件被划分成不同的模块.应用可以根据自己的需要来选择使用合适的模块.每个模块都会暴露一些公共的方法或属性.模块使用者直接 ...
- Node中的net模块提供的前端通信
Node中的net模块提供的前端通信 客户端 业务: 客户端现在要在终端输入内容,然后回车发送内容给服务器 解决: Node中提供了一个叫做 readline 的 模块用于读取命令行内容 [ 单行读取 ...
- Node.js 教程 04 - 模块系统
前言: Node.js的模块系统类似于C/C++的文件引用,可以声明对象,也可以定义类 创建对象. 大家这么理解,就简单了. 定义: 为了让Node.js的文件可以相互调用,Node.js提供了一个简 ...
- Node.js入门:模块机制
CommonJS规范 早在Netscape诞生不久后,JavaScript就一直在探索本地编程的路,Rhino是其代表产物.无奈那时服务端JavaScript走的路均是参考众多服务器端语言来 ...
- node 学习笔记 - Modules 模块加载系统 (1)
本文同步自我的个人博客:http://www.52cik.com/2015/12/11/learn-node-modules-path.html 用了这么久的 require,但却没有系统的学习过 n ...
随机推荐
- $mount方法是用来挂载我们的Vue.extend扩展的
html <body> <div id="app"> <diy></diy> </div> </body> ...
- IDEA入门级使用教程----你怎么还在用eclipse?
http://blog.csdn.net/qq_31655965/article/details/52788374
- python3.6配置libsvm2.2
参考自:https://blog.csdn.net/weixin_35884839/article/details/79398085 由于需要使用到libsvm,所以开始配这个,所幸一次性就成功了. ...
- 让你的 Python 代码优雅又地道
示例代码和引用的语录都来自Raymond的演讲.这是我按我的理解整理出来的,希望你们理解起来跟我一样顺畅! 遍历一个范围内的数字 for i in [0, 1, 2, 3, 4, 5]: print ...
- burp suite 的intruder 四种攻击方式
一:sniper[狙击手] 这种攻击基于原始的请求内容,需要一个字典,每次用字典里的一个值去代替一个待攻击的原始值. 攻击次数=参数个数X字典内元素个数 例如:原始请求中 name=aa , pass ...
- PyEngine3D
git clone https://github.com/ubuntunux/PyEngine3D cd PyEngine3D pip install -r requirements.txt pyth ...
- Centos7安装JDK8以及环境配置
下载,选择centos7 64位版本 https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.h ...
- Spring boot @Scheduled(cron = "* * * * * *") cron表达式详解
//@Scheduled(cron = "0 0/15 * * * ?") //每15分钟触发一次 //@Scheduled(cron = "5/10 * * * * ? ...
- link 和 import的区别
二者区别: link属于html标签,而@import是css提供的. 页面被加载时,link因为是HTM标签, 把认会同时被加载,而@import引用的css会等到页面加载结束后加载. link是h ...
- 如何完整卸载Mysql数据库
mysql数据库首次安装失败,后来多次安装均失败,原因就是没有完全卸载mysql数据库 那么如何完整卸载MYSQL数据库呢? 介绍mysql数据库完整卸载的方法 完美卸载MYSQL 在管理工具-服务里 ...