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极简入门教程(二):定时器
Oct 25 NodeJs
Nodejs实现多人同时在线移动鼠标的小游戏分享
Dec 06 NodeJs
NodeJS学习笔记之(Url,QueryString,Path)模块
Jan 13 NodeJs
nodeJS代码实现计算交社保是否合适
Mar 09 NodeJs
NodeJs——入门必看攻略
Jun 27 NodeJs
简单实现nodejs上传功能
Jan 14 NodeJs
nodejs multer实现文件上传与下载
May 10 NodeJs
详解nodejs中express搭建权限管理系统
Sep 15 NodeJs
nodejs基于express实现文件上传的方法
Mar 19 NodeJs
nodejs express配置自签名https服务器的方法
May 22 NodeJs
Nodejs使用Mongodb存储与提供后端CRD服务详解
Sep 04 NodeJs
通过实例了解Nodejs模块系统及require机制
Jul 16 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 GD 图像处理组件的常用函数总结
2010/04/28 PHP
PHP开发者常犯的10个MySQL错误更正剖析
2012/01/30 PHP
ThinkPHP中url隐藏入口文件后接收alipay传值的方法
2014/12/09 PHP
php实现网页端验证码功能
2017/07/11 PHP
php 根据URL下载远程图片、压缩包、pdf等文件到本地
2019/07/26 PHP
DIY jquery plugin - tabs标签切换实现代码
2010/12/11 Javascript
JavaScript入门之事件、cookie、定时等
2011/10/21 Javascript
JS解析json数据并将json字符串转化为数组的实现方法
2012/12/25 Javascript
onkeydown事件解决按回车键直接提交数据的需求
2013/04/11 Javascript
jQuery ui 利用 datepicker插件实现开始日期(minDate)和结束日期(maxDate)
2014/05/22 Javascript
JS判断当前页面是否在微信浏览器打开的方法
2015/12/08 Javascript
基于javascript显示当前时间以及倒计时功能
2016/03/18 Javascript
基于JS实现横线提示输入验证码随验证码输入消失(js验证码的实现)
2016/10/27 Javascript
vue 动态修改a标签的样式的方法
2018/01/18 Javascript
2分钟实现一个Vue实时直播系统的示例代码
2020/06/05 Javascript
Vue如何循环提取对象数组中的值
2020/11/18 Vue.js
[05:20]2018DOTA2亚洲邀请赛主赛事第三日战况回顾 LGD率先挺进胜者组决赛
2018/04/06 DOTA
[04:32]玩具屠夫中文语音节选
2020/08/23 DOTA
Python实现完整的事务操作示例
2017/06/20 Python
python实现批量修改文件名代码
2017/09/10 Python
Python+OpenCV人脸检测原理及示例详解
2020/10/19 Python
Python即时网络爬虫项目启动说明详解
2018/02/23 Python
详解如何用TensorFlow训练和识别/分类自定义图片
2019/08/05 Python
HTML5的hidden属性兼容老浏览器的方法
2014/04/23 HTML / CSS
Reformation官网:美国女装品牌
2018/09/14 全球购物
全球领先的在线cosplay服装商店:RoleCosplay
2020/01/18 全球购物
公益活动策划方案
2014/01/09 职场文书
大二学生学习个人自我评价
2014/01/19 职场文书
大学毕业感言一句话
2014/02/06 职场文书
家长对学生的评语
2014/04/18 职场文书
促销活动总结范文
2014/04/30 职场文书
2014领导班子正风肃纪思想汇报
2014/09/18 职场文书
运动会报道稿300字
2014/10/02 职场文书
老公保证书怎么写
2015/02/26 职场文书
2015年银行信贷员工作总结
2015/05/19 职场文书
2016春季运动会开幕词
2016/03/04 职场文书