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

需先去下载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文档。

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

(0)

相关推荐

  • Python使用socket模块实现简单tcp通信

    正文开始: 服务器端代码: # 再来简单的测试,这个是服务器端 import socket import sys BUF_SIZE = 1024 ip_port = (r"127.0.0.1", 11552) my_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 先拿到套接字,指定个ipv4以及流式数据包 my_socket.bind(ip_port) # 绑定 my_socket.listen(2) # 循环等

  • Python Websocket服务端通信的使用示例

    1.唠唠叨叨 最近又回顾了下Websocket,发现已经忘的七七八八了.于是用js写了客户端,用python写了服务端,来复习一下这方面的知识. WebSocket 是一种标准协议,用于在客户端和服务端之间进行双向数据传输.但它跟 HTTP 没什么关系,它是基于 TCP 的一种独立实现. 以前客户端想知道服务端的处理进度,要不停地使用 Ajax 进行轮询,让浏览器隔个几秒就向服务器发一次请求,这对服务器压力较大.另外一种轮询就是采用 long poll 的方式,这就跟打电话差不多,没收到消息就一

  • 在Android中使用WebSocket实现消息通信的方法详解

    前言 消息推送功能可以说移动APP不可缺少的功能之一,一般简单的推送我们可以使用第三方推送的SDK,比如极光推送.信鸽推送等,但是对于消息聊天这种及时性有要求的或者三方推送不满足业务需求的,我们就需要使用WebSocket实现消息推送功能. 基本流程 WebSocket是什么,这里就不做介绍了,我们这里使用的开源框架是https://github.com/TakahikoKawasaki/nv-websocket-client 基于开源协议我们封装实现WebSocket的连接.注册.心跳.消息分

  • JAVA实现SOCKET多客户端通信的案例

    一.ServerSocket 1.为了方便调试,先创建一个界面用于显示客户端连接信息 基于javafx包写的一个简单界面! javafx.scene.control.TextArea ta = new javafx.scene.control.TextArea(); @Override public void start(Stage primaryStage) throws Exception { scene = new Scene(ta,450,200); primaryStage.setTi

  • Java多线程实现TCP网络Socket编程(C/S通信)

    开篇必知必会 在前一篇<基于TCP协议网络socket编程(java实现C/S通信)>,实际存在一个问题,如果服务器端在建立连接后发送多条信息给客户端,客户端是无法全部接收的,原因在于客户端为单线程,只接受了第一条信息,剩余信息阻塞等待下一次发送.所以,这造成了客户端无法处理消息队列,每次只接收并输出一条服务器信息,出现信息不同步问题. 本篇将解决这个问题,详细记录实现java多线程通信,目标是使客户端可以一次接收服务器发送的多条信息,避免阻塞.方法是将客户端接收信息功能独立为一个线程来完成,

  • 通过实例解析Socket套接字通信原理

    一.Socket是什么 Socket 的中文翻译过来就是"套接字".套接字是什么,我们先来看看它的英文含义:插座. Socket 就像一个电话插座,负责连通两端的电话,进行点对点通信,让电话可以进行通信,端口就像插座上的孔,端口不能同时被其他进程占用.而我们建立连接就像把插头插在这个插座上,创建一个 Socket 实例开始监听后,这个电话插座就时刻监听着消息的传入,谁拨通我这个"IP 地址和端口",我就接通谁. 实际上,Socket 是在应用层和传输层之间的一个抽象

  • 如何基于C语言socket编程实现TCP通信

    TCP/IP协议(Transmission Control Protocol/Internet Protocol)叫做传输控制/网际协议,又叫网络通信协议.实际上,它包含上百个功能的协议,如ICMP(互联网控制信息协议).FTP(文件传输协议).UDP(用户数据包协议).ARP(地址解析协议)等.TCP负责发现传输的问题,一旦有问题就会发出重传信号,直到所有数据安全正确的传输到目的地. 套接字(socket):在网络中用来描述计算机中不同程序与其他计算机程序的通信方式.socket其实是一种特殊

  • Vue+Java 通过websocket实现服务器与客户端双向通信操作

    1. vue代码 methods: { //在方法里调用 this.websocketsend()发送数据给服务器 onConfirm () { //需要传输的数据 let data = { code: 1, item: '传输的数据' } this.websocketsend(JSON.stringify(data)) }, /* */ initWebSocket () { // 初始化weosocket let userinfo = getUserInfo() let username =

  • java实现基于TCP协议网络socket编程(C/S通信)

    一.前言:TCP原理简介 首先,保证文章完整性,TCP的理论原理还是需要简介一下,略显枯燥๑乛◡乛๑. TCP(传输控制协议,Transmission Control Protocol)是一种面向连接的.可靠的.基于字节流的传输层通信协议.TCP旨在适应支持多网络应用的分层协议层次结构.也就是说,TCP是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议. 连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务. 以上TCP的特点,也正是与UD

  • java实现基于UDP协议网络Socket编程(C/S通信)

    一.前言:认识UDP UDP,全称User Datagram Protocol(用户数据报协议),是Internet 协议集支持一个无连接的传输协议.UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法. UDP主要用于不要求分组顺序到达的传输中,分组传输顺序的检查与排序由应用层完成,提供面向报文的简单不可靠信息传送服务.UDP 协议基本上是IP协议与上层协议的接口,适用端口分别运行在同一台设备上的多个应用程序. 二.UDP的特点(与TCP相比) 正是UDP提供不可靠服务

随机推荐