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中调用系统命令、Shell脚本和Python脚本的方法和实例
Jan 01 NodeJs
NodeJS学习笔记之FS文件模块
Jan 13 NodeJs
你一定会收藏的Nodejs代码片段
Feb 04 NodeJs
Nodejs进阶之服务端字符编解码和乱码处理
Sep 04 NodeJs
nodejs实现截取上传视频中一帧作为预览图片
Dec 10 NodeJs
nodejs中用npm初始化来创建package.json的实例讲解
Oct 10 NodeJs
nodejs更新package.json中的dependencies依赖到最新版本的方法
Oct 10 NodeJs
使用nodejs分离html文件里的js和css详解
Apr 12 NodeJs
如何让Nodejs支持H5 History模式(connect-history-api-fallback源码分析)
May 30 NodeJs
nodejs中各种加密算法的实现详解
Jul 11 NodeJs
nodejs环境使用Typeorm连接查询Oracle数据
Dec 05 NodeJs
nodejs使用Sequelize框架操作数据库的实现
Oct 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
Syphon 秘笈
2021/03/03 冲泡冲煮
PHP个人网站架设连环讲(二)
2006/10/09 PHP
利用php绘制饼状图的实现代码
2013/06/07 PHP
PHP给前端返回一个JSON对象的实例讲解
2018/05/31 PHP
Javascript 布尔型分析
2008/12/22 Javascript
JSON扫盲帖 JSON.as类教程
2009/02/16 Javascript
jQuery dialog 异步调用ashx,webservice数据的代码
2010/08/03 Javascript
jquery限定文本框只能输入数字即整数和小数
2013/11/29 Javascript
JavaScript1.6数组新特性介绍以及JQuery的几个工具方法
2013/12/06 Javascript
JavaScript 事件绑定及深入
2015/04/13 Javascript
14款经典网页图片和文字特效的jQuery插件-前端开发必备
2015/08/25 Javascript
jQuery实现的左右移动焦点图效果
2016/01/14 Javascript
jQuery文字提示与图片提示效果实现方法
2016/07/04 Javascript
javascript使用闭包模拟对象的私有属性和方法
2016/10/05 Javascript
JS验证input输入框(字母,数字,符号,中文)
2017/03/23 Javascript
Koa 使用小技巧(小结)
2018/10/22 Javascript
详解微信小程序实现仿微信聊天界面(各种细节处理)
2019/02/17 Javascript
微信小程序自定义弹出模态框禁止底部滚动功能
2020/03/09 Javascript
解决VantUI popup 弹窗不弹出或无蒙层的问题
2020/11/03 Javascript
JavaScript 异步时序问题
2020/11/20 Javascript
[01:38]DOTA2第二届亚洲邀请赛中国区预选赛出线战队晋级之路
2017/01/17 DOTA
Python写的贪吃蛇游戏例子
2014/06/16 Python
Python运行报错UnicodeDecodeError的解决方法
2016/06/07 Python
python生成随机图形验证码详解
2017/11/08 Python
情人节快乐! python绘制漂亮玫瑰
2020/08/18 Python
python将类似json的数据存储到MySQL中的实例
2019/07/12 Python
使用python实现飞机大战游戏
2020/03/23 Python
哪种Python框架适合你?简单介绍几种主流Python框架
2020/08/04 Python
香港太阳眼镜网上商店:SmartBuyGlasses香港
2016/07/22 全球购物
微软巴西官方网站:Microsoft Brasil
2019/09/26 全球购物
德国在线香料制造商:Gewürzland
2020/03/10 全球购物
公司担保书范文
2014/05/21 职场文书
优秀班主任主要事迹材料
2014/12/16 职场文书
二十年同学聚会致辞
2015/07/28 职场文书
自荐信大全
2019/03/21 职场文书
html+css实现分层金字塔的实例
2021/06/02 HTML / CSS