当我们去面试的时候,常常会遇到这样一个问题:当用户在浏览器地址栏输入一段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的更多相关文章

  1. 利用Node.js的Net模块实现一个命令行多人聊天室

    1.net模块基本API 要使用Node.js的net模块实现一个命令行聊天室,就必须先了解NET模块的API使用.NET模块API分为两大类:Server和Socket类.工厂方法. Server类 ...

  2. Node.js的Formidable模块的使用

    今天总结了下Node.js的Formidable模块的使用,下面做一些简要的说明. 1)     创建Formidable.IncomingForm对象 var form = new formidab ...

  3. Node.js的net模块

    net模块提供了一个异步网络包装器,用于TCP网络编程,它包含了创建服务器和客户端的方法 创建TCP服务器 net.createServer方法 创建客户端去连接服务器 net.connect方法 简 ...

  4. node.js中ws模块创建服务端和客户端,网页WebSocket客户端

    首先下载websocket模块,命令行输入 npm install ws 1.node.js中ws模块创建服务端 // 加载node上websocket模块 ws; var ws = require( ...

  5. node.js中net模块创建服务器和客户端(TCP)

    node.js中net模块创建服务器和客户端 1.node.js中net模块创建服务器(net.createServer) // 将net模块 引入进来 var net = require(" ...

  6. node.js入门(二) 模块 事件驱动

    模块化结构 node.js 使用了 CommonJS 定义的模块系统.不同的功能组件被划分成不同的模块.应用可以根据自己的需要来选择使用合适的模块.每个模块都会暴露一些公共的方法或属性.模块使用者直接 ...

  7. Node中的net模块提供的前端通信

    Node中的net模块提供的前端通信 客户端 业务: 客户端现在要在终端输入内容,然后回车发送内容给服务器 解决: Node中提供了一个叫做 readline 的 模块用于读取命令行内容 [ 单行读取 ...

  8. Node.js 教程 04 - 模块系统

    前言: Node.js的模块系统类似于C/C++的文件引用,可以声明对象,也可以定义类 创建对象. 大家这么理解,就简单了. 定义: 为了让Node.js的文件可以相互调用,Node.js提供了一个简 ...

  9. Node.js入门:模块机制

    CommonJS规范      早在Netscape诞生不久后,JavaScript就一直在探索本地编程的路,Rhino是其代表产物.无奈那时服务端JavaScript走的路均是参考众多服务器端语言来 ...

  10. node 学习笔记 - Modules 模块加载系统 (1)

    本文同步自我的个人博客:http://www.52cik.com/2015/12/11/learn-node-modules-path.html 用了这么久的 require,但却没有系统的学习过 n ...

随机推荐

  1. LOJ121 「离线可过」动态图连通性

    思路 动态图连通性的板子,可惜我不会在线算法 离线可以使用线段树分治,每个边按照存在的时间插入线段树的对应节点中,最后再dfs一下求出解即可,注意并查集按秩合并可以支持撤销操作 由于大量使用STL跑的 ...

  2. (zhuan) Building Convolutional Neural Networks with Tensorflow

    Ahmet Taspinar Home About Contact Building Convolutional Neural Networks with Tensorflow Posted on a ...

  3. computed 计算选项

    computed 的作用主要是对原数据进行改造输出.改造输出:包括格式的编辑,大小写转换,顺序重排,添加符号……. 格式化输出结果 我们先来做个读出价格的例子:我们读书的原始数据是price:100 ...

  4. Netty 核心组件笔记

    Netty是一款高效的NIO框架和工具,基于JAVA NIO提供的API实现. 在JAVA NIO方面Selector给Reactor模式提供了基础,Netty结合Selector和Reactor模式 ...

  5. Docker5之Deploy your app

    Make sure you have published the friendlyhello image you created by pushing it to a registry. We’ll ...

  6. Kylin介绍2

    原理 官网 doc cube介绍 安装 案例 企业级特性 Apache Kylin 1.5的新功能和架构改变 Java  API 通过java代码对kylin进行cube build kylin从入门 ...

  7. CSS深入

    块元素:div.h1.p等等. 列表的样式: /*使用系统提供的一些样式:例如无序.有序都可以使用circle*/ ul{ list-style-type: circle; } ol{ list-st ...

  8. NPOI导入导出EXCEL通用类,可直接使用在WinForm项目中

    由于XSSFWorkbook类型的Write方法限制,Write完成后就自动关闭流数据,所以无法很好的支持的Web模式,网上目前也未找到好的解决方案. 注意:若直接使用在WinForm项目中,必需先下 ...

  9. 关于js中splice方法返回的结果

    一.前言 刚刚在使用splice()方法,发现这个方法返回的是删除后的数组元素,如果要获取删除指定元素后的数组,直接调用原来的数组即可!因为splice()会改变原来数组!之前对splice()方法一 ...

  10. python的json模块的dumps,loads,dump,load方法介绍

    dumps和loads方法都在内存中转换, dump和load的方法会多一个步骤,dump是把序列化后的字符串写到一个文件中,而load是从一个文件中读取字符串 将列表转为字符串 >>&g ...