概念

Socket.io 是一个支持客户端和服务器之间的低延迟、双向和基于事件的通信的库,除了支持 JavaScript 以外,还支持 Java、Python、Golang。

Socket.io 构建在 WebSocket 协议之上,并提供了额外的保证,如回退到 HTT P长轮询或自动重新连接。和 Ajax、Fetch、Axios 不一样的是,WebSocket 支持客户端与服务器之间一直保持通信,除非其中一方主动断开连接。

开始

下面将从三个章节开始。第一个章节——建立项目;第二个章节——服务端,演示如何创建 Socket 服务;第三个章节——客户端,演示如何创建接收 Socket 服务的客户端。

建立项目

随便在你的电脑上创建一个父工程,我这里取名父工程为socketio。子工程依赖于父工程的node_modules,因此子工程无需再在 package.json 添加任何 dependencies 和 devDependencies。

父工程下创建两个子工程serverclient。所以,工程项目的目录结构是:

socketio
-node_modules
-server
-src
index.js
package.json
-client
-src
index.js
package.json
package.json
package-lock.json

导入依赖

导入 socket.io 和 socket.io-client 两个依赖包,外加热部署的 nodemon。

npm i socket.io socket.io-client nodemon

服务端

package.json

该子工程不需要添加任何依赖,依赖全部在父工程中。在 package.json 我们配置启动脚本:

{
"name": "server",
"version": "1.0.0",
"type": "module",
"scripts": {
"serverStart": "nodemon ./src/index.js"
}
}

创建服务端

在这里我们使用 ES6 模块导入语法,使用最简洁的方式创建 Socket 服务端。

  1. 导入 Server 对象;
  2. new Server 对象;
  3. 监听 connection 事件;
  4. 开启 Socket 服务端口号。
import { Server } from "socket.io";

const server = new Server({ /* options */ });

server.on("connection", (socket) => {
// ...
}); io.listen(3000);

客户端

客户端的 package.json 配置方式和服务端一样。以下是创建 Socket 客户端的步骤:

  1. 导入 lookup 函数连接服务端 URL;
  2. 监听 connect 事件。
import { io } from "socket.io-client";

const client = io("http://localhost:3000");

client.on("connect", () => {
// ...
});

在第一个步骤中,我说的是导入 lookup 函数,但实际却是 io 函数。因为 Socket.io 重命名了 lookup 函数的导出名称:

查看源码可知,lookup 有三个不一样参数的重载,并且通过重命名导出不一样。其实使用 io 和 connect 都可以,从第一个往后的所有参数都可不填,connect 第一个参数可以是字符串。所以,也可以像下面这样写:

import { connect } from "socket.io-client";

const client = connect("http://localhost:3000");

测试

客户端连接服务端时,客户端分配唯一 ID,当客户端连接到服务端时,服务端的监听事件 connection 可以从回调函数中获得客户端的 ID:

server

server.on("connection", (socket) => {
console.log(`An user connected, He is ${ socket.id }`);
});

client

client.on("connect", () => {
console.log(`Hi, I am ${ client.id }`);
});

入门 Socket.io的更多相关文章

  1. Vue3 + Socket.io + Knex + TypeScript 实现可以私聊的聊天室

    前言 下文只在介绍实现的核心代码,没有涉及到具体的实现细节,如果感兴趣可以往下看,在文章最后贴上了仓库地址.项目采用前后端模式,前端使用 Vite + Vue3 + TS:后端使用 Knex + Ex ...

  2. socket.io入门整理教程

    socket.io入门整理  发布于 5 年前  作者 dtrex  124983 次浏览  最后一次编辑是 1 年前 我自己在用socket.io开发,对官方网站上的文档,进行简单的整理,然后自己写 ...

  3. Socket.io 入门 - Renyi的博客

    Socket.io Vue 中使用 NPM 安装 npm install vue-socket.io --save npm install --save socket.io-client 引用 详情 ...

  4. socket.io简单入门(一.实现简单的图表推送)

    引子:随着nodejs蓬勃发展,虽然主要业务系统因为架构健壮性不会选择nodejs座位应用服务器.但是大量的内部系统却可以使用nodejs试水,大量的前端开发人员转入全堆开发也是一个因素. 研究本例主 ...

  5. Node.js、Express、Socket.io 入门

    前言 周末断断续续的写了第一个socket.io Demo.初次接触socket.io是从其官网看到的,看着get started做了一遍,根据官网的Demo能提供简单的服务端和客户端通讯. 这个De ...

  6. socket.io 入门教程

    转载自:http://deadhorse.me/nodejs/2011/12/29/socket.io_induction.html socket.io socket.io是一个以实现跨浏览器.跨平台 ...

  7. 转载:socket.io 入门

    原文链接:http://cnodejs.org/topic/50a1fcc7637ffa4155b5a264 我自己在用socket.io开发,对官方网站上的文档,进行简单的整理,然后自己写了一个简单 ...

  8. socket.io 入门篇(三)

    本文原文地址:https://www.limitcode.com/detail/5926e3a056fba70278bf2044.html 前言 上篇我们介绍了 socket.io 中room的概念和 ...

  9. socket.io 入门篇(二)

    本文原文地址:https://www.limitcode.com/detail/5922f1ccb1d4fe074099d9cd.html 前言 上篇我们介绍了 socket.io 基本使用方法,本篇 ...

随机推荐

  1. 我用 AntV/S2 买了一套房

    背景 经过一年多的摇号,我在前两天收到了某网红盘的摇中通知.还沉浸在摇中房屋喜悦中的我,很快被售房顾问告知选房的人很多,每位购房者的选房时间都很短,必须 一分钟内 快速选房.并且,排在 400 多号的 ...

  2. 深入C++04:模板编程

    模板编程 函数模板 模板意义:对类型也进行参数化: 函数模板:是不编译的,因为类型不知道 模板的实例化:函数调用点进行实例化,生成模板函数 模板函数:这才是要被编译器所编译的 函数模板.模板的特例化. ...

  3. 3D可视化解决方案为巷道工程安全护航

    最近山东栖霞笏山金矿事故中被困22名矿工的生命安全,在揪着全国民的心.大家都在祈求他们能从井下活着回来. 正是由于被困矿工的坚韧意志和政府相关部门不眠不休的奋力营救,11名矿工终于在被困十余日后平安升 ...

  4. 揭秘GaussDB(for Redis):全面对比Codis

    摘要:Codis集群在国内Redis生态圈很流行,社区已停止维护.本文从架构和特性两方面对比,带你感受华为云GaussDB(for Redis)的全新价值. 本文分享自华为云社区<华为云Gaus ...

  5. Python实现简繁体转换,真的玩得花

    大家好鸭, 我是小熊猫 直接开搞!!! 1.opencc-python 首先介绍opencc中的Python实现库,它具有安装简单,翻译准确,使用方便等优点.对于我们日常的需求完全能够胜任. 1.1安 ...

  6. python常见的错误提示处理

    python常见的错误有 NameError变量名错误 IndentationError代码缩进错误 AttributeError对象属性错误 TypeError类型错误 IOError输入输出错误 ...

  7. NC21181 重返小学

    NC21181 重返小学 题目 题目描述 ​ 时光依旧,岁月匆匆.转眼间,曾经的少年郭嘉烜已经长大成人,考上了一所优秀的大学--兰州大学.在经历了一年来自牛顿.莱布尼茨.拉普拉斯的精神洗礼后,他终于决 ...

  8. 零基础学Java(1)初识Java程序

    前言 就国内来说,Java毫无疑问是后端语言中的No.1没有之一,所以今天我们也来0基础学习Java!!! Java的好处(针对测试工程师) 面试加分->涨薪 大多数公司服务端用的都是Java, ...

  9. mybatis查询的三种方式

    查询最需要关注的问题:①resultType自动映射,②方法返回值:  interface EmpSelectMapper: package com.atguigu.mapper; import ja ...

  10. for循环 --和复合赋值

    阶乘 1.n!=1x2x3x4x...xn 2.写出一个程序,让用户输入n,然后计算输出n! *变量: *显然读用户的输入需要一个int的n,然后计算的结果需要用一个变量保存,可以是int的facto ...