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服务器(10):处理POST请求
Dec 18 NodeJs
浅谈NodeJS中require路径问题
May 07 NodeJs
使用Angular和Nodejs、socket.io搭建聊天室及多人聊天室
Aug 21 NodeJs
Nodejs中的this详解
Mar 26 NodeJs
Nodejs获取网络数据并生成Excel表格
Mar 31 NodeJs
nodejs如何获取时间戳与时间差
Aug 03 NodeJs
详解NodeJs支付宝移动支付签名及验签
Jan 06 NodeJs
使用nodejs下载风景壁纸
Feb 05 NodeJs
nodejs使用express创建一个简单web应用
Mar 31 NodeJs
深入解析nodejs HTTP服务
Jul 25 NodeJs
Nodejs处理异常操作示例
Dec 25 NodeJs
nodejs使用socket5进行代理请求的实现
Feb 21 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中CI操作多个数据库的代码
2012/07/05 PHP
php笔记之:php数组相关函数的使用
2013/04/26 PHP
如何使用php判断服务器是否是HTTPS连接
2013/07/05 PHP
PHP中将ip地址转成十进制数的两种实用方法
2013/08/15 PHP
了解jQuery技巧来提高你的代码(个人觉得那个jquery的手册很不错)
2012/02/10 Javascript
js multiple全选与取消全选实现代码
2012/12/04 Javascript
js弹出框轻量级插件jquery.boxy使用介绍
2013/01/15 Javascript
jQuery插件datalist实现很好看的input下拉列表
2015/07/14 Javascript
Vue网页html转换PDF(最低兼容ie10)的思路详解
2017/08/24 Javascript
Vue 中的compile操作方法
2018/02/26 Javascript
在vue项目中引入highcharts图表的方法
2019/01/21 Javascript
Vue路由对象属性 .meta $route.matched详解
2019/11/04 Javascript
微信小程序实现滚动Tab选项卡
2020/11/16 Javascript
[02:50]【扭转乾坤,只此一招】DOTA2全新版本永雾林渊开启新篇章
2020/12/24 DOTA
Python多进程分块读取超大文件的方法
2016/04/13 Python
python 出现SyntaxError: non-keyword arg after keyword arg错误解决办法
2017/02/14 Python
numpy实现合并多维矩阵、list的扩展方法
2018/05/08 Python
python3爬取torrent种子链接实例
2020/01/16 Python
Python ADF 单位根检验 如何查看结果的实现
2020/06/03 Python
python全栈开发语法总结
2020/11/22 Python
如何使用python-opencv批量生成带噪点噪线的数字验证码
2020/12/21 Python
巴基斯坦电子产品购物网站:Home Shopping
2017/09/14 全球购物
Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别?
2012/06/05 面试题
Java中会存在内存泄漏吗,请简单描述
2016/12/22 面试题
大学生求职自荐信
2013/12/12 职场文书
机关门卫岗位职责
2013/12/30 职场文书
电厂职工自我鉴定
2014/02/20 职场文书
学校纪律作风整改措施思想汇报
2014/10/11 职场文书
倡议书作文
2015/01/19 职场文书
夫妻吵架保证书
2015/05/08 职场文书
小学班主任工作随笔
2015/08/15 职场文书
2016年毕业实习心得体会范文
2015/10/09 职场文书
Mysql 如何查询时间段交集
2021/06/08 MySQL
Golang数据类型和相互转换
2022/04/12 Golang
使用ICOM IC-R9500接收机同时测评十台收音机中波接收性能
2022/05/10 无线电
阿里云服务器(windows)手动部署FTP站点详细教程
2022/08/05 Servers