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 ...
随机推荐
- UVA 10870 Recurrences(矩阵乘法)
题意 求解递推式 \(f(n)=a_1*f(n-1)+a_2*f(n-2)+....+a_d*f(n-d)\) 的第 \(n\) 项模以 \(m\). \(1 \leq n \leq 2^{31}-1 ...
- SQL语句总结2018-11-7
增加一条数据 insert into table (列字段1,列字段2)values(列1值,列2值) 删除一条数据 delete from table where 列名1=值1 修改一条数据 upd ...
- 如何快速获取properties中的配置属性值
本文为博主原创,未经博主允许,不得转载: 在项目中,经常需要将一些配置的常量信息放到properties文件中,这样在项目的配置变动的时候,只需要修改配置文件中 对应的配置常量即可. 在项目应用中,如 ...
- 解决 dpkg: warning: files list file for package 'x' missing 问题
参考: dpkg: warning: files list file for package 'x' missing 解决 dpkg: warning: files list file for pac ...
- 20165306学习基础和C语言基础调查
20165306学习基础和C语言基础调查 技能学习心得 我认为兴趣.责任感.毅力对技能的获得非常重要. 因为我从小五音不全.肢体不协调,所以看春晚等节目的时候会把更多的关注点放在主持人身上.小时候觉得 ...
- spring读取bean有几种方式
bean加载到spring的方式: 第一种:xml 第二种:注释「一定要配合包扫描」: <context:component-scan base-package="Cristin.Co ...
- 原创:R包制作--windows
1.下载安装Rtools,添加环境变量: 打开R,分别输入下面指令,看有无包错: system('g++ -v') system('where make') 2.package.skeleton()函 ...
- Codeforces 769D k-Интересные пары чисел
题目链接:http://codeforces.com/contest/769/problem/D 搜索题 考虑这些数的值域较小,直接${O(2^{k})}$次方枚举每个数字二进制位上是否改变,剪枝一下 ...
- 【BZOJ】3142: [Hnoi2013]数列
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3142 12年也有一个组合数学...(这几年的画风啊.... 考虑直接去做:DP? DP+容 ...
- [原][osg][QT]osg与QT界面结合的简单例子二
//main.cpp #include "VREObliqueEditorQTWindow.h" #include <QtWidgets/QApplication> # ...