Nodejs环境实现socket通信过程解析


Posted in NodeJs onJuly 03, 2020

结构:

socket是应用层和传输层的桥梁。(传输层之上的协议所涉及的数据都是在本机处理的,并没进入网络中)

涉及数据:

socket所涉及的数据是报文,是明文。

作用:

建立长久链接,供网络上的两个进程通信。

nodejs环境下的简单通信。

代码:

serve:

// 1 引入模块
const net = require('net');
// 2 创建服务器
let clientArr = [];
const server = net.createServer();
// 3 绑定链接事件
server.on('connection',(person)=>{
console.log(clientArr.length);
// 记录链接的进程
person.id = clientArr.length;
clientArr.push(person);
person.setEncoding('utf8');
// 客户socket进程绑定事件
person.on('data',(chunk)=>{
console.log(chunk);
clientArr.forEach((val)=>{
// 数据写入全部客户进程中
val.write(chunk);
})
})
person.on('close',(p1)=>{
clientArr[p1.id] = null;
} )
person.on('error',(p1)=>{
clientArr[p1.id] = null;
})
})
server.listen(800);

client:

// 1 引入模块
const net = require('net');
const readline = require('readline');
// 2 创建套接字和输入输出命令行
let rl = readline.createInterface({
// 调用std接口
input:process.stdin,
output:process.stdout
})
let client = new net.Socket();
// 3 链接
client.connect(800,'localhost');

client.setEncoding('utf8');
client.on('data',(chunk)=>{

})
client.on('error',(e)=>{
console.log(e.message);
})
// 绑定输io流事件,获取输入输出字符
rl.on('line',(mes)=>{
client.write(mes);
})

小结:

server端:绑定连接事件 --> 在连接事件中管理客户端进程对象(1,把添加到数组中 2,处理客户端发来的数据)-->开启端口监听请求 。

client端:创建连接服务器用的套接字 --> 连接服务器 。

socket建立的连接是长久连接。而应用层的http协议是3次握手协议,是短连接。

socket工作原理和http类似,只是不规定断开连接的时间。可以把http理解成一个人办一件事情就跑一次连接流程。socket理解成只跑一次连接流程,只到把所有的事情都做完了才回去。

Socket主要作用是实现客户端与服务端的实时通信保持通话,它不像ajax请求,每次对话完成后都会把连接断开。Socket通信在

Node.js中实现其实很简单,没有想象中复杂,基本上只要懂得监听(.on)和推送(.emit)消息,即能实现Socket通信。

Socket服务端

在服务端使用Socket,需先引入socket.io模块,该模块详细文档可参考https://socket.io/:

cnpm install socket.io

服务端实例代码如下:

var server = app.listen(8081, "127.0.0.1", function() {
  var host = server.address().address;
  var port = server.address().port;
});
 
/********************socketIO********************/
var io = require('socket.io').listen(server);
// 建立连接
io.sockets.on('connection', function(socket) { //此处每个回调socket就是一个独立的客户端,通常会用一个公共列表数组统一管理
  // 连接断开,如关闭页面时触发
  socket.on('disconnect', function() {
    console.log('已断开链接');
  });
  // 监听客户端发送的消息
  socket.on('clientmessage', function(data) {
    //推送给除自己外其他所有用户的消息,类似于广播
    socket.broadcast.emit('message', {
      text: '你的朋友上线了'
    });
  });
  //发送给自己的消息
  socket.emit('message', {
    text: '你上线了'
  });
});

上例中实现了4步:

1. 建立连接并添加断开连接监听。

2. 建立clientmessage监听,当客户端发来该名称的事件时,服务器向除自己外其他的用户广播事件名称为message的消息。

3.在刚建立连接时,向客户端推送事件名称为message的消息。

其中主要应用到的函数有5个:

  • .on('connection', function(socket){ }):与客户端建立连接时监听。
  • .on('disconnect', function(){ }):与客户端断开连接时监听。
  • .on('event-name', function(data) { }):监听客户端发来的消息。
  • .broadcast.emit('event-name', { }):向除自己外的所有其他用户广播消息。
  • .emit('event-name', { }):仅向当前连接的客户端(自己)推送消息。

(注)相关客户端的接口关联请往下看客户端的例子。

Socket客户端

需先去下载socket.io.js文件,下载地址为:https://github.com/socketio/socket.io-client

客户端实例代码如下:

<!DOCTYPE html>
<html>
 
  <head>
    <meta charset="UTF-8">
    <title>socketio测试</title>
    <script>
      var tmp_html = '<link rel="stylesheet" href="../js/libs/bootstrap/3.3.7/css/bootstrap.css" rel="external nofollow" />';
      tmp_html += '<script src="../js/libs/jquery/3.2.1/jquery.js"><\/script>';
      tmp_html += '<script src="../js/libs/bootstrap/3.3.7/bootstrap.js"><\/script>';
      tmp_html += '<script src="../js/libs/socketio/socket.io.js"><\/script>';
      document.write(tmp_html);
      document.close();
    </script>
  </head>
 
  <body>
    <button id="btn">发送消息</button>
  </body>
  <script>
    var socket = io.connect('http://127.0.0.1:8081');
    socket.on('message', function(data) {
      console.log(data.text);
    })
 
    $("#btn").click(function() {
      socket.emit('clientmessage', {
        text: "hello"
      });
    });
  </script>
</html>

客户端主要应用到的函数有2个:

  • .on('event-name', function(data) { }):监听服务端发来的消息。
  • .emit('event-name', { }):向服务端推送消息。

Socket即时通信就是那么简单,而且在连接断开时还会自动重连。还有一种实现方法就是使用net模块的套接字,可以直接查看Node.js文档。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
跟我学Nodejs(二)--- Node.js事件模块
May 21 NodeJs
Nodejs的express使用教程
Nov 23 NodeJs
详解nodejs 文本操作模块-fs模块(四)
Dec 22 NodeJs
nodejs和php实现图片访问实时处理
Jan 05 NodeJs
NodeJS仿WebApi路由示例
Feb 28 NodeJs
nodejs读写json文件的简单方法(必看)
Mar 09 NodeJs
docker中编译nodejs并使用nginx启动
Jun 23 NodeJs
nodejs中sleep功能实现暂停几秒的方法
Jul 12 NodeJs
nodejs操作mongodb的填删改查模块的制作及引入实例
Jan 02 NodeJs
nodejs实现的连接MySQL数据库功能示例
Jan 25 NodeJs
nodejs中express入门和基础知识点学习
Sep 13 NodeJs
NodeJS 将文件夹按照存放路径变成一个对应的JSON的方法
Oct 17 NodeJs
使用nodejs实现JSON文件自动转Excel的工具(推荐)
Jun 24 #NodeJs
nodejs各种姿势断点调试的方法
Jun 18 #NodeJs
在NodeJs中使用node-schedule增加定时器任务的方法
Jun 08 #NodeJs
nodeJS与MySQL实现分页数据以及倒序数据
Jun 05 #NodeJs
NodeJS多种创建WebSocket监听的方式(三种)
Jun 04 #NodeJs
Sublime Text3 配置 NodeJs 环境的方法
May 20 #NodeJs
Nodejs实现WebSocket代码实例
May 19 #NodeJs
You might like
PHP中file_exists与is_file,is_dir的区别介绍
2012/09/12 PHP
用php实现百度网盘图片直链的代码分享
2012/11/01 PHP
php中怎么搜索相关联数组键值及获取之
2013/10/17 PHP
php curl_init函数用法
2014/01/31 PHP
php实现redis数据库指定库号迁移的方法
2015/01/14 PHP
PHP获取某个月最大天数(最后一天)的方法
2015/07/29 PHP
Laravel 5+ .env环境配置文件详解
2020/04/06 PHP
jQuery html() in Firefox (uses .innerHTML) ignores DOM changes
2010/03/05 Javascript
De facto standard 世界上不可思议的事实标准
2010/08/29 Javascript
js限制文本框只能输入整数或者带小数点的数字
2015/04/27 Javascript
JS实现的仿QQ空间图片弹出效果代码
2016/02/23 Javascript
jQuery实现的导航动画效果(附demo源码)
2016/04/01 Javascript
JavaScript判断数组是否存在key的简单实例
2016/08/03 Javascript
Node.js下自定义错误类型详解
2016/10/17 Javascript
Vue.js Ajax动态参数与列表显示实现方法
2016/10/20 Javascript
JS验证不重复验证码
2017/02/10 Javascript
图片加载完成再执行事件的实例
2017/11/16 Javascript
JavaScript字符串处理常见操作方法小结
2019/11/15 Javascript
详解vuejs中执行npm run dev出现页面cannot GET/问题
2020/04/26 Javascript
[01:05:32]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第一局
2016/03/04 DOTA
[55:11]完美世界DOTA2联赛PWL S2 SZ vs LBZS 第一场 11.26
2020/11/30 DOTA
python获取文件扩展名的方法
2015/07/06 Python
分享Python开发中要注意的十个小贴士
2016/08/30 Python
python使用pandas抽样训练数据中某个类别实例
2020/02/28 Python
如何使用Cython对python代码进行加密
2020/07/08 Python
CSS实现半透明边框与多重边框的场景分析
2019/11/13 HTML / CSS
兰蔻加拿大官方网站:Lancome加拿大
2016/08/05 全球购物
REISS美国官网:伦敦最受欢迎的时尚品牌
2019/08/16 全球购物
NYX Professional Makeup官方网站:专业彩妆和美容产品
2019/10/29 全球购物
酒店服务与管理毕业生求职信
2013/11/02 职场文书
职业规划书如何设计?
2014/01/09 职场文书
师生聚会感言
2014/01/26 职场文书
员工试用期自我评价
2014/09/18 职场文书
2015年领导干部廉洁自律工作总结
2015/05/26 职场文书
元素水平垂直居中的方式
2021/03/31 HTML / CSS
element tree树形组件回显数据问题解决
2022/08/14 Javascript