结构:

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

涉及数据:

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

作用:

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

nodejs环境下的简单通信。

代码:

serve:

  1. // 1 引入模块
  2. const net = require('net');
  3. // 2 创建服务器
  4. let clientArr = [];
  5. const server = net.createServer();
  6. // 3 绑定链接事件
  7. server.on('connection',(person)=>{
  8. console.log(clientArr.length);
  9. // 记录链接的进程
  10. person.id = clientArr.length;
  11. clientArr.push(person);
  12. person.setEncoding('utf8');
  13. // 客户socket进程绑定事件
  14. person.on('data',(chunk)=>{
  15. console.log(chunk);
  16. clientArr.forEach((val)=>{
  17. // 数据写入全部客户进程中
  18. val.write(chunk);
  19. })
  20. })
  21. person.on('close',(p1)=>{
  22. clientArr[p1.id] = null;
  23. } )
  24. person.on('error',(p1)=>{
  25. clientArr[p1.id] = null;
  26. })
  27. })
  28. server.listen(800);

client:

  1. // 1 引入模块
  2. const net = require('net');
  3. const readline = require('readline');
  4. // 2 创建套接字和输入输出命令行
  5. let rl = readline.createInterface({
  6. // 调用std接口
  7. input:process.stdin,
  8. output:process.stdout
  9. })
  10. let client = new net.Socket();
  11. // 3 链接
  12. client.connect(800,'localhost');
  13.  
  14. client.setEncoding('utf8');
  15. client.on('data',(chunk)=>{
  16.  
  17. })
  18. client.on('error',(e)=>{
  19. console.log(e.message);
  20. })
  21. // 绑定输io流事件,获取输入输出字符
  22. rl.on('line',(mes)=>{
  23. client.write(mes);
  24. })

小结:

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

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

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

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

————————————————
版权声明:本文为CSDN博主「yiqiebyjian」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yiqiebyjian/article/details/79644482

nodejs系列(10)实现socket通信

2018-02-08 14:33:50 @黄小泽 阅读数 2987更多

分类专栏: 前端集合 nodejs
 
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。

Socket主要作用是实现客户端与服务端的实时通信保持通话,它不像ajax请求,每次对话完成后都会把连接断开。Socket通信在Node.js中实现其实很简单,没有想象中复杂,基本上只要懂得监听(.on)和推送(.emit)消息,即能实现Socket通信。

Socket服务端

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

  1. cnpm install socket.io

服务端实例代码如下:

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

上例中实现了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

客户端实例代码如下:

  1. <!DOCTYPE html>
  2. <html>
  3.  
  4. <head>
  5. <meta charset="UTF-8">
  6. <title>socketio测试</title>
  7. <script>
  8. var tmp_html = '<link rel="stylesheet" href="../js/libs/bootstrap/3.3.7/css/bootstrap.css"/>';
  9. tmp_html += '<script src="../js/libs/jquery/3.2.1/jquery.js"><\/script>';
  10. tmp_html += '<script src="../js/libs/bootstrap/3.3.7/bootstrap.js"><\/script>';
  11. tmp_html += '<script src="../js/libs/socketio/socket.io.js"><\/script>';
  12. document.write(tmp_html);
  13. document.close();
  14. </script>
  15. </head>
  16.  
  17. <body>
  18. <button id="btn">发送消息</button>
  19. </body>
  20. <script>
  21. var socket = io.connect('http://127.0.0.1:8081');
  22. socket.on('message', function(data) {
  23. console.log(data.text);
  24. })
  25.  
  26. $("#btn").click(function() {
  27. socket.emit('clientmessage', {
  28. text: "hello"
  29. });
  30. });
  31. </script>
  32.  
  33. </html>

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

 

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

.emit('event-name', { }):向服务端推送消息。

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

 

nodejs环境下的socket通信的更多相关文章

  1. 解析浏览器和nodejs环境下console.log()的区别

    写在前面的 在开发调试过程中,我们经常需要调用console.log 方法来打印出当前变量的值,然而,console.log在浏览器环境下 有时会出现一些异常的现象 开撸代码 在浏览器和nodejs环 ...

  2. nodejs环境下配置运行mysql

    首先需要在本地运行node环境   必须在本地安装mysql(可以用xampp里面的) 在node环境下引入mysql模块   命令: npm install node-mysql 运用例子(前提条件 ...

  3. 【.NET+MQTT】.NET6 环境下实现MQTT通信,以及服务端、客户端的双边消息订阅与发布的代码演示

    前言: MQTT广泛应用于工业物联网.智能家居.各类智能制造或各类自动化场景等.MQTT是一个基于客户端-服务器的消息发布/订阅传输协议,在很多受限的环境下,比如说机器与机器通信.机器与物联网通信等. ...

  4. c++ 网络编程(一)TCP/UDP windows/linux 下入门级socket通信 客户端与服务端交互代码

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9601511.html c++ 网络编程(一)TCP/UDP  入门级客户端与服务端交互代码 网 ...

  5. c++ 网络编程(二) linux 下多进程socket通信 多个客户端与单个服务端交互代码实现回声服务器

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9612820.html 锲子-- 预备知识优雅的关闭套接字连接: 基于TCP的半关闭 TCP中的 ...

  6. 简单的Linux下的socket通信,小程序,方便以后查看。

    首先是我的一个出错提示的头文件<myerr.h>,自从用了根本停不下来啊!!! #ifndef _MYERR_H_ #define _MYERR_H_ #include <stdio ...

  7. 【NodeJs环境下bower】如何更改bower_components文件夹的位置

    bower在初始化,默认是将bower_components文件夹放到项目的根目录下,若是public/index.html如何配置bower_components下的js或者css类库呢?只需要将b ...

  8. Linux环境下实现管道通信-问题

    #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <errn ...

  9. 解决nodejs环境下端口号被占用的方法

    假设被占用的端口号是8081 1.进入cmd命令窗口 输入netstat -ano|findstr "8081" cmd窗口给我的信息尾部有一个和端口8081对应的PID值 '51 ...

随机推荐

  1. #w29 2019年大前端技术周刊

    本周是2019年第29周 移动端 移动开发十周年总结 相对于持续几百年工业革命,移动互联网的发展是短暂的.在这十几年的发展中,为了满足开源和节流的涌现出很多技术.接下来我们将会以开发方式的演进.基建与 ...

  2. Docker 系列之 基础入门

    安装 Docker Windows 10 专业版以上版本 Docker for Windows Installer 在安装前,需要确保目标机器已经开启了硬件虚拟化和 HyperV :在安装的过程中建议 ...

  3. ASP.NET MVC教程五:ASP.NET MVC中的路由

    一.概述 在ASP.NET MVC架构中,控制器在3大核心构件中处于中心地位,通过控制器支配模型和视图,然而从浏览器发出的请求到控制器还需要路由的协助,路由将特定的请求和控制器的动作对应起来. 在AS ...

  4. 关于hover与after,before已及first-letter,first-line的联用

    0920自我总结 关于hover与after,before已及first-letter,first-line的联用 一.写法 元素:hover::after{样式} 元素:hover::before{ ...

  5. javaWeb核心技术第八篇之Cookie和Session

    会话技术: 会话是什么? 浏览器和服务器交互,浏览器打开网页访问服务器,会话开始,正常交互. 浏览器关闭,会话结束. 会话能干什么? 会话可以共享数据. Cookie和session将数据保存在不同的 ...

  6. Python Web(一)

    Infi-chu: http://www.cnblogs.com/Infi-chu/ 一.Web框架 1.socket网络编程 架构:C/S 协议:TCP/UDP 传输层 2.Web应用 架构:B/S ...

  7. 微信小程序 wxml 文件中如何让多余文本省略号显示?

    废话不多说,之前写小程序碰到了一个问题,如何在 wxml 页面中截取数据? 1.wxs   取数据想必大家都会,不就是 substring 吗?但是这种方法在 wxml 页面中是无效的. 那还有 cs ...

  8. HTML基础——表单的应用

    1.表单的构成 一个完整的表单由表单控件(表单元素).提示信息和表单域3个部分构成. 表单控件:包含了具体的表单功能项,如单行文本输入框.密码输入框.复选框.提交按钮.搜索框等. 提示信息:一个表单中 ...

  9. BPC成员公式

    BPC可以通过成员公式,定义维度成员之间相关的计算公式,前端自动得到相应计算结果. 新建成员公式,选择对应的维度成员. 编辑维度成员的计算公式.保存后激活维度即可.

  10. arcgis api 4.x for js 基础工具篇之测距测面

    前言 在搭建好WebGIS应用框架的时候,相信大家首先开发的都会是基础功能,此篇文章我们主要讲述的是“测距”."测面"功能. 注* 在测量单位中常规都是基于"平面坐标系& ...