nodejs python 通信_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理解成只跑一次连接流程,只到把所有的事情都做完了才回去。

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客户端

客户端实例代码如下:

socketio测试

var tmp_html = '';

tmp_html += '

tmp_html += '

tmp_html += '

document.write(tmp_html);

document.close();

发送消息

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"

});

});

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

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

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427100.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php 标点符号,php 过滤英文标点符号及过滤中文标点符号代码

php 过滤英文标点符号及过滤中文标点符号代码发布于 2014-12-22 20:19:00 | 733 次阅读 | 评论: 0 | 来源: 网友投递PHP开源脚本语言PHP(外文名: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Per…

jenkins安装(用户配置)(2)

1安装rebulider(再次构建可以少写很多参数)插件 2安装safe restart安全重启 3系统管理—Configure Global Security—安全矩阵 添加admin用户给与全部权限 4系统管理—管理用户—添加用户 给与用户所有权限,取消第一个勾选,不给予…

发生系统错误53_SAP那些事-推理剧-36-奇怪的付款清账(F-53)报错“TABLE_INVALID_INDEX”...

问题描述:在使用F-53进行供应商付款清账操作时,模拟凭证(包括保存凭证)时出现如下的ABAP Down错误:问题分析:从报错内容看,我们首先看到报错的程序为SAPMF05A,这个程序财务顾问都熟悉…

微信公众平台-杂项:小程序导航

ylbtech-微信公众平台-杂项:小程序导航1.返回顶部 1、小程序导航 微导航 http://www.we123.com/xcx/ 91udhttp://www.91ud.com/app/ 微信主页 http://www.weixinzhuye.com/app.html 2、2.返回顶部3.返回顶部4.返回顶部5.返回顶部 6.返回顶部1、公众号导航 微小宝 ht…

jenkins安装环境搭建(3)

1安装环境搭建 yum -y install java安装java环境 2安装git用于存储和管理源代码 yum -y install git 3安装并配置git git config --global user.name “yao666” git config --global user.email 1327629137qq.com ssh-keygen -t rsa -C 1327629137qq.com cd ~/.ssh 证书正确 …

php中冒号是什么,在PHP中:(双冒号)和-(箭头)有什么区别?

当左侧部分是对象实例时,可以使用->..否则,您将使用::.这意味着->主要用于访问实例成员(尽管它也可用于访问静态成员,但不鼓励这种使用),而::通常用于访问静态成员(尽管在一些特殊情况下,它用于访问实例成员)。总…

seo伪原创工具_文章伪原创工具哪个好用(伪原创工具有哪些)

从事网站seo优化的工作基本上每天都会和文章打交道,因为网站的排名与网站的收录关系是非常大的,网站的收录又和文章息息相关,搜索引擎的胃口是比较喜欢新的内容、原创的内容,而对于一些文案功底比较没那么好的SEOer来说&#xff0…

Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析【转】...

Android系统的运行时库层代码是用C来编写的,用C 来写代码最容易出错的地方就是指针了,一旦使用不当,轻则造成内存泄漏,重则造成系统崩溃。不过系统为我们提供了智能指针,避免出现上述问题,本文将系统地分析…

Jenkins安装(Maven安装)(4)

Maven安装 //进入一个目录 cd /usr/local //创建一个文件夹 mkdir maven //下载maven的tar包 wget https://mirrors.cnnic.cn/apache/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz //解压tar包 tar -xf apache-maven-3.5.4-bin.tar.gz mv apache-maven-3.5.4 /…

php7 nts,php7.0.24-nts配置步骤

php-cgi.exe文件运行php-cgi.exe -b 127.0.0.1:9000 -c D:/myphp2017/php7-nts/php.ininginx命令启动 start nginx关闭 ngnix -s stopphp.ini中CGI信息配置enable_dl Oncgi.force_redirect 0cgi.fix_pathinfo1fastcgi.impersonate 1cgi.rfc2616_headers 1nginx.conf的配置#…

函数调用关系图如何画_彩铅画入门植物教程 | 如何用彩铅画一株多肉?多肉彩铅画教程步骤图详细...

画画不难,难的是不拿起手中的笔去画。彩铅画入门植物教程 | 如何用彩铅画一株多肉?多肉彩铅画教程步骤图详细多肉的质感如何表达呢?还是那句话:艺术来源于生活,要仔细观察。拿我们今天画的多肉来说,首先要观…

jenkins安装 新建节点(5)

1部署程序,tomcat部署不多说 2新建节点 系统管理—管理节点—新建节点 3完成 4这一点要注意 进行验证任务 创建任务—构建一个自由风格的软件—确定 限制项目的运行节点 选择testenv 构建 执行脚本 输入ifconfig验证 构建成功

php设置cookie值,PHP如何设置和取得Cookie值

PHP函数setcookie()用来设置cookie.setcookie()函数必须在标签之前调用,语法是setcookie (name, value, expire, path, domain) 例如:setcookie(“user”, “Alex Porter”, time()3600);?>setcookie(“url”, “http://www.mianwww.com”, time()36…

关于onclick点击无效问题

当要点击的标签在form标签内时&#xff0c;onclick无效。在这个问题上困了好长时间&#xff0c;一项一项排查&#xff0c;自学尤其是遇到问题时&#xff0c;真是麻烦。 还有删除节点报错问题&#xff1a; li.innerHTML content"<span>删除<span>";就是因…

工厂方法模式_1天1个设计模式——工厂方法模式

意图工厂方法模式是一种创建型设计模式&#xff0c; 其在父类中提供一个创建对象的方法&#xff0c; 允许子类决定实例化对象的类型。问题假设你正在开发一款物流管理应用。1.0版本只能支持处理卡车运输&#xff0c;因此大部分的代码都位于名为Truck的类中。随着业务越来越广泛…

hadoop简介(大数据技术)

Hadoop可运行于一般的商用服务器上&#xff0c;具有高容错、高可靠性、高扩展性等特点 特别适合写一次&#xff0c;读多次的场景 适合 大规模数据 流式数据&#xff08;写一次&#xff0c;读多次&#xff09; 商用硬件&#xff08;一般硬件&#xff09; 不适合 低延时的数据访问…

session与cokkie区别

刚刚转载于:https://www.cnblogs.com/igoodful/p/9511773.html

如何创建php文件,PHP如何生成.php程序文件

前台程序不少情况下需要生成.php文件&#xff0c;诸如多用户的在线日记程序、留言簿以及自助网站程序等等&#xff0c;都不可避免地在与用户的交互中生成.php程序文件。一般的&#xff0c;所生成的.php文件内容并不复杂&#xff0c;但麻雀虽小五脏俱全&#xff0c;完整的.php文…

python 字符串比较忽略大小写的方法_python实现忽略大小写对字符串列表排序的方法...

本文实例讲述了python实现忽略大小写对字符串列表排序的方法&#xff0c;是非常实用的技巧。分享给大家供大家参考。具体分析如下&#xff1a;先来看看如下代码&#xff1a;string the stirngHas manyline InTHE fIlejb51 netlist_of_string string.split()print list_of_str…

storm简介(大数据技术)

Apache Storm简介 由 chalex 创建&#xff0c;小路依依 最后一次修改 2016-12-12 什么是Apache Storm&#xff1f; Apache Storm是一个分布式实时大数据处理系统。Storm设计用于在容错和水平可扩展方法中处理大量数据。它是一个流数据框架&#xff0c;具有最高的摄取率。虽然St…