nodejs环境下的socket通信
结构:
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理解成只跑一次连接流程,只到把所有的事情都做完了才回去。
————————————————
版权声明:本文为CSDN博主「yiqiebyjian」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yiqiebyjian/article/details/79644482
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"/>';
- 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环境下的socket通信的更多相关文章
- 解析浏览器和nodejs环境下console.log()的区别
写在前面的 在开发调试过程中,我们经常需要调用console.log 方法来打印出当前变量的值,然而,console.log在浏览器环境下 有时会出现一些异常的现象 开撸代码 在浏览器和nodejs环 ...
- nodejs环境下配置运行mysql
首先需要在本地运行node环境 必须在本地安装mysql(可以用xampp里面的) 在node环境下引入mysql模块 命令: npm install node-mysql 运用例子(前提条件 ...
- 【.NET+MQTT】.NET6 环境下实现MQTT通信,以及服务端、客户端的双边消息订阅与发布的代码演示
前言: MQTT广泛应用于工业物联网.智能家居.各类智能制造或各类自动化场景等.MQTT是一个基于客户端-服务器的消息发布/订阅传输协议,在很多受限的环境下,比如说机器与机器通信.机器与物联网通信等. ...
- c++ 网络编程(一)TCP/UDP windows/linux 下入门级socket通信 客户端与服务端交互代码
原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9601511.html c++ 网络编程(一)TCP/UDP 入门级客户端与服务端交互代码 网 ...
- c++ 网络编程(二) linux 下多进程socket通信 多个客户端与单个服务端交互代码实现回声服务器
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9612820.html 锲子-- 预备知识优雅的关闭套接字连接: 基于TCP的半关闭 TCP中的 ...
- 简单的Linux下的socket通信,小程序,方便以后查看。
首先是我的一个出错提示的头文件<myerr.h>,自从用了根本停不下来啊!!! #ifndef _MYERR_H_ #define _MYERR_H_ #include <stdio ...
- 【NodeJs环境下bower】如何更改bower_components文件夹的位置
bower在初始化,默认是将bower_components文件夹放到项目的根目录下,若是public/index.html如何配置bower_components下的js或者css类库呢?只需要将b ...
- Linux环境下实现管道通信-问题
#include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <errn ...
- 解决nodejs环境下端口号被占用的方法
假设被占用的端口号是8081 1.进入cmd命令窗口 输入netstat -ano|findstr "8081" cmd窗口给我的信息尾部有一个和端口8081对应的PID值 '51 ...
随机推荐
- #w29 2019年大前端技术周刊
本周是2019年第29周 移动端 移动开发十周年总结 相对于持续几百年工业革命,移动互联网的发展是短暂的.在这十几年的发展中,为了满足开源和节流的涌现出很多技术.接下来我们将会以开发方式的演进.基建与 ...
- Docker 系列之 基础入门
安装 Docker Windows 10 专业版以上版本 Docker for Windows Installer 在安装前,需要确保目标机器已经开启了硬件虚拟化和 HyperV :在安装的过程中建议 ...
- ASP.NET MVC教程五:ASP.NET MVC中的路由
一.概述 在ASP.NET MVC架构中,控制器在3大核心构件中处于中心地位,通过控制器支配模型和视图,然而从浏览器发出的请求到控制器还需要路由的协助,路由将特定的请求和控制器的动作对应起来. 在AS ...
- 关于hover与after,before已及first-letter,first-line的联用
0920自我总结 关于hover与after,before已及first-letter,first-line的联用 一.写法 元素:hover::after{样式} 元素:hover::before{ ...
- javaWeb核心技术第八篇之Cookie和Session
会话技术: 会话是什么? 浏览器和服务器交互,浏览器打开网页访问服务器,会话开始,正常交互. 浏览器关闭,会话结束. 会话能干什么? 会话可以共享数据. Cookie和session将数据保存在不同的 ...
- Python Web(一)
Infi-chu: http://www.cnblogs.com/Infi-chu/ 一.Web框架 1.socket网络编程 架构:C/S 协议:TCP/UDP 传输层 2.Web应用 架构:B/S ...
- 微信小程序 wxml 文件中如何让多余文本省略号显示?
废话不多说,之前写小程序碰到了一个问题,如何在 wxml 页面中截取数据? 1.wxs 取数据想必大家都会,不就是 substring 吗?但是这种方法在 wxml 页面中是无效的. 那还有 cs ...
- HTML基础——表单的应用
1.表单的构成 一个完整的表单由表单控件(表单元素).提示信息和表单域3个部分构成. 表单控件:包含了具体的表单功能项,如单行文本输入框.密码输入框.复选框.提交按钮.搜索框等. 提示信息:一个表单中 ...
- BPC成员公式
BPC可以通过成员公式,定义维度成员之间相关的计算公式,前端自动得到相应计算结果. 新建成员公式,选择对应的维度成员. 编辑维度成员的计算公式.保存后激活维度即可.
- arcgis api 4.x for js 基础工具篇之测距测面
前言 在搭建好WebGIS应用框架的时候,相信大家首先开发的都会是基础功能,此篇文章我们主要讲述的是“测距”."测面"功能. 注* 在测量单位中常规都是基于"平面坐标系& ...