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 ...
随机推荐
- SPOJ 694 DISUBSTR - Distinct Substrings
思路 求本质不同的子串个数,总共重叠的子串个数就是height数组的和 总子串个数-height数组的和即可 代码 #include <cstdio> #include <algor ...
- map数据结构
学习map的这种ES6新加的数据结构.在一些构建工具中是非常喜欢使用map这种数据结构来进行配置的,因为map是一种灵活,简单的适合一对一查找的数据结构.我们知道的数据结构,已经有了json和set. ...
- K8S 安装笔记
1. 准备CentOS7环境 #关闭防火墙 # systemctl disable firewalld # systemctl stop firewalld #安装etcd, kubernetes(会 ...
- Java创建对象的几种方式。
Java创建对象的几种方式(重要): (1) 用new语句创建对象,这是最常见的创建对象的方法. (2) 运用反射手段,调用java.lang.Class或者java.lang.reflect.Con ...
- Lintcode9-Fizz Buzz-Easy
Fizz Buzz Given number n. Print number from 1 to n. But: when number is divided by 3, print "fi ...
- Tomcat 跨域问题的解决
先下载CORS对应的Jar: 下载链接: https://download.csdn.net/download/u010739157/10565169 在tomcat的Web.xml中加上如下配置: ...
- BioConda--转载
1. Conda安装 如BioConda官网[1]所说,BioConda需要Conda安装环境,如果你使用过Anaconda python安装环境,那么你已经有了Conda安装环境,否则,最好的办法是 ...
- 【Python】【面向对象】
"""# [[面向对象]]#[访问限制]#如果要让内部属性不被外部访问,可加双下划线,编程私有变量.只有内部可以访问,外部不能访问.class Student(objec ...
- Spring boot2.0 设置文件上传大小限制
今天把Spring boot版本升级到了2.0后,发现原来的文件上传大小限制设置不起作用了,原来的application.properties设置如下: spring.http.multipart.m ...
- python 读写json文件(dump, load),以及对json格式的数据处理(dumps, loads)
JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. 1.json.dumps()和json.loads()是json ...