首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么我需要显式地调用app.listen(端口)才能使express-ws工作?

在使用Express框架时,我们可以通过app.listen(端口)来启动一个HTTP服务器并监听指定的端口。而在使用express-ws插件时,它提供了WebSocket的支持,但是它并不会自动启动WebSocket服务器,需要我们显式地调用app.listen(端口)来启动WebSocket服务器。

这是因为WebSocket是基于HTTP协议的,它需要在HTTP服务器的基础上建立起WebSocket连接。而Express框架本身是基于Node.js的HTTP模块构建的,它可以创建一个HTTP服务器并监听指定的端口。当我们调用app.listen(端口)时,Express会创建一个HTTP服务器并开始监听指定的端口,这样就可以接收HTTP请求。

而express-ws插件则是在Express框架的基础上添加了WebSocket的支持。当我们在代码中使用express-ws插件创建WebSocket路由时,它会将WebSocket相关的处理逻辑添加到Express框架中。但是,为了使WebSocket服务器能够正常工作,我们仍然需要调用app.listen(端口)来启动HTTP服务器,这样WebSocket服务器才能建立在HTTP服务器之上。

总结起来,我们需要显式地调用app.listen(端口)来使express-ws工作,是因为WebSocket服务器需要建立在HTTP服务器之上,而Express框架本身是基于Node.js的HTTP模块构建的,需要通过调用app.listen(端口)来启动HTTP服务器。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

实时会话系统实现(2) --- express-ws改写会话系统

实际上在会话系统我们目前仅仅需要websocket连接,发送消息,接受消息三个方法,所以我们在websocket.js中定义这三个方法,然后使用module.exports导出,使得在任何界面都可以调用这几个方法...下一步需要在服务端实现wss接口。...接口是在chat.js中实现,接下来我们在chat.js中引用express-ws,这里需要注意如果分文件实现接口必须在app.js和具体的接口js文件都引入express-ws可以正常使用。...然后接口的实现实际上和http接口实现方法类似,我们引入express-ws后实际上router就多了一个ws方法,就是用来书写websocket接口,然后接口中实际上是存在两部分逻辑,第一次调用就等于...可以发现我们使用websocket可以开启一个长连接成功实现实时会话系统,有消息送达马上接收渲染,而不用像http轮询一样不断重复请求接口造成贷款和服务器资源的浪费。

95530

前端架构师破局技能,NodeJS 落地 WebSocket 实践

也许你会问:既然 Socket.IO 在 WebSocket 的基础上做了那么多的优化,并且非常成熟,那为什么还要搭一个原生 WebSocket 服务?...集成到 Express 框架的优点是,我们不需要单独监听一个端口,使用框架启动的端口即可,并且我们还可以指定访问到某个路由,发起 WebSocket 连接。...幸运的是这一切不需要手动实现,express-ws 模块已经帮我们做好了大部分的集成工作。...首先安装,然后在入口文件引入: var expressWs = require('express-ws')(app) 和 Express 的 Router 一样,express-ws 也支持注册全局路由和局部路由...源码+答疑 本文所有的代码都是经过亲自实践,为了便于小伙伴们查阅和试验,建了一个 GitHub 仓库专门存放本文的完整源码,以及之后文章的完整源码。

1.7K20

git入门篇(1)--初识Gi

可能很多人没有使用过Git但是也听说过Git,Git是一个分布版本控制工具,我们在开始之前先来谈谈为什么我们需要一个版本控制工具。...如果不使用分布版本控制工具我们只能创建一个文件夹,然后每次修改不断另存为新的文件,然后来存储我们不同版本的论文。...SVN的大名可能很多人都听说过,集中式这个词其实已经可以体现这种版本控制工具的缺点,集中式版本控制工具必须联网才能使用,而且版本库都有一个单一的集中管理的服务器,用于管理所有文件的所有修改版本,我们工作之前需要先从中央服务器取得最新的版本...分布版本控制工具可以在每个人的电脑中创建一个完整的版本库,因此分布版本控制工具集中不需要存在一台统一管理版本库的服务器。那我们针对刚才说过的SVN的缺点来说明为什么我们要采用Git。...Git如何让做好备份工作 我们刚才一直在说Git在本地创建版本库,那版本库存储在本地磁盘,本地磁盘出问题的所有版本库不就直接全部丢失了。

51020

Node.js—Express使用、Express 路由 、Express 中间件、托管静态资源、使用 Express 写接口、node.js链接sqlite数据库

Express 安装 首先假定你已经安装了 Node.js,接下来为你的应用创建一个目录,然后进入此目录并将其作为当前工作目录。...创建的最基本的web服务器 第五行中 '/',指的是根目录,可以理解为什么都没带,就比如我是8080端口打开,那么此时的地址栏为 http://localhost:8080/。...第九行中调用app.listen方法,启动服务器,是监听了port这个端口号,监听成功后执行回调。...代码示例 const express = require('express') const app = express() // => 在这里,调用 express.static() 方法,快速对外提供静态资源...通过安装和配置cors中间件,可以很方便解决跨域问题。

1.1K32

Web前端学习 第5章 node基础教程6 Koa基础

然后通过app的listen方法设置监听端口,运行这个程序就可以移动一个koa服务器了。...console.log("server is running") 11 }); app的use方法可以调用一个函数(中间件),这个函数会在请求和相应之间被调用。...= "hello world" 7 await next(); 8 }) 9 10 app.use(async (ctx,next) => { 11 console.log("是一个中间件...(3000,() => { 16 console.log("server is running") 17 }); 这样我们就可以实现一个有多个页面的应用程序了 五、静态文件 在网页中插入图片,需要在...web应用的服务器,只有静态文件目录的文件可以被html页面直接访问。 也就是说,我们需要先创建一个静态文件目录,然后在里面放置图片(或js,或css),才能被html页面访问。

35710

XDM,JS如何函数编程?看这就够了!(一)

JS 就是轻量级的函数编程! 拆解一下这句话,品味一下~ 本瓜将借助《JavaScript 轻量级函数编程》一书带领你先透析它的落脚点函数编程,然后再看看 JS 为什么被称为是 “轻量的”!...直到最近几年,函数编程成为整个开发界的主流观念。 函数编程有完善且清晰的原则,一旦我们知道这些原则,我们将能更加快速读懂代码,定位问题。这是为什么函数编程重要的原因!...而声明代码,以及我们努力遵循函数编程原则所写出的代码,更专注于描述最终的结果。 函数编程以另一种方式来思考代码应该如何组织才能使数据流更加明显,并能让读者很快理解你的思想。...后一个版本中的 return 表示一个输出,而前者的 y 赋值是一个隐输出。 通常,开发人员喜欢模式而不是隐模式。 为什么说后者 return 出来的就是的?...这不需要理由。 感谢阅读 是掘金安东尼,公众号【掘金安东尼】,关注前端,也关注生活,持续输出ing......

42130

几种常见的跨域解决方法

咱就这么想,服务器返回的数据是需要被解析的,那么就让服务器返回数据时调用一个函数,这个函数的形参就是服务器返回的数据(这个需要服务器配合的),所以我们指定一个query参数过去,让服务器去解析出需要调用的函数...3000端口,把3000端口当作一个转接器,从而得到数据这里的5000端口的express是自己简单封装的一个类,不是express框架,所以写法有点不一样//5000端口服务器const express...3000端口是express框架,问我为啥5000不也用express框架写,那就是懒得写,因为5000端口是之前写的,直接拿来用了//3000端口服务器const express = require...})()})app.listen(3000, (err) => { if (err) { return } console.log("服务器已经启动,端口3000...日常工作中,用得比较多的跨域方案是cors和Proxy代理服务器,Proxy主要就是利用同源策略对服务器不起作用。

1.6K60

真正的 Tornado 异步非阻塞

Tronado 为协程实现了一套自己的协议,不能使用 Python 普通的生成器。...使用过 Python 生成器应该知道,想要启动生成器的话必须手动执行 next() 方法行,所以这里的 coroutine 装饰器的其中一个作用就是在调用这个异步函数时候自动执行生成器。...所以在处理一些小负载的工作,是能起到很好的效果,让 Tornado 异步非阻塞的跑起来。...但是明明知道这个函数中做的是高负载的工作,那么你应该采用另一种方式,使用 Tornado 结合 Celery 来实现异步非阻塞。...基于 Celery 的异步编程 Celery 是一个简单、灵活且可靠的,处理大量消息的分布系统,专注于实时处理的任务队列,同时也支持任务调度。

3.8K60

CentOS Linux中搭建Hadoop和Spark集群详解

,网上很多文章的教程中是没有的,这是因为这些端口默认就是8032、8031这样,感觉没有必要再次配置。...的理解是,因为在yarn-site.xml文件中没有将这些端口配置出来的原因,导致子节点无法向主节点注册(Registered)——然后,从报错的信息看貌似是只要把8031端口配置上了就可以了,...其实也不是so easy的……如果不配置其他端口,则提交yarn任务的时候会无限卡在ACCEPTED状态上,卡在该状态上的日志看不出问题来,但是确实把上面的端口都配置了之后就好了。...因此,最好是将这些端口配置好!!!...3) 至于SPARK_MASTER_HOST和SPARK_MASTER_PORT,感觉没有必要配置,因为人家使用默认值也是没有问题的,但是还是配上了,不配置的话会不会有问题就不知道了。

1.3K20

C#规范整理·资源管理和序列化

如果我们的类型使用到了非托管资源,或者需要释放托管资源,那么就需要让类型继承接口IDisposable,这毫无例外。...这相当于告诉调用者:类型对象是需要释放资源的,你需要调用类型的Dispose方法。,一个标准的继承了IDisposable接口的类型应该像下面这样去实现。...注意2 如果调用者已经调用Dispose方法进行了资源释放,那么,隐释放资源(也就是终结器)就没有必要再运行了。...5.在Dispose模式中应区别对待托管资源和非托管资源# Dispose模式设计的思路基于:如果调用调用了Dispose方法,那么类型就该按部就班将自己的资源全部释放。...7.及时释放资源# 很多人会注意到:垃圾回收机制自动为我们隐回收了资源(垃圾回收器会自动调用终结器),于是不禁会问:为什么还要主动释放资源呢?

24720

Data Binding 库使用的经验教训

这样你就可以调用你的文本创建者类并使用内建 view binding: 这样我们可以从内建的绑定操作过程中提高效率,并且我们可以非常轻松对创建格式化字符串的代码进行单元测试。...如果值实际发生了改变,我们调用 setMaxLines() 等方法。 编辑按: 感谢 Alexandre Gianquinto 在评论中提到『double parameters』功能。...好吧这确实有效,但是有一些需要注意的地方,这是由于『DB 库』的工作机制。...有种替代方法是在布局中声明 ViewState 中的每个变量,然后传递组合状态实例中的值,如下所示: 这显然会使开发人员维护和同步更多的代码,但它确实意味着『DB 库』可以优化去运行哪些表达式。...个人一直在布局中使用单个变量,传入的 ViewState 实例,并依赖于我们的视图绑定合理运行。这就是为什么让视图绑定变得高效非常重要。

41420

厌倦了NullPointException?Optional拯救你!

因此,你必须检测这个值是否存在,如果不存在就不能使用任何Option类型的操作符;这样由于Scala的类型系统,你永远也不会忘记对于空指针的检测。...Optional对象包含了一些方法来地处理某个值是存在还是缺失,Optional类强制你思考值不存在的情况,这样就能避免潜在的空指针异常。...值存在的时候进行进一步的操作 现在你有了一个Optional对象,你可以地处理值存在或者不存在的情况,再也不用想这样如履薄冰进行空指针检测了: SoundCard soundcard = ...;...例如:你可能需要检测一个USB的端口是否是一个特定的版本;如果需要避免空指针异常,通畅的方式是检测非空然后调用getVersion方法,如下: USB usb = ...; if(usb !...为什么

98520

提示 Data Binding 库使用的经验教训

这样你就可以调用你的文本创建者类并使用内建 view binding: 这样我们可以从内建的绑定操作过程中提高效率,并且我们可以非常轻松对创建格式化字符串的代码进行单元测试。...如果值实际发生了改变,我们调用 setMaxLines() 等方法。 编辑按: 感谢 Alexandre Gianquinto 在评论中提到『double parameters』功能。...好吧这确实有效,但是有一些需要注意的地方,这是由于『DB 库』的工作机制。...有种替代方法是在布局中声明 ViewState 中的每个变量,然后传递组合状态实例中的值,如下所示: 这显然会使开发人员维护和同步更多的代码,但它确实意味着『DB 库』可以优化去运行哪些表达式。...个人一直在布局中使用单个变量,传入的 ViewState 实例,并依赖于我们的视图绑定合理运行。这就是为什么让视图绑定变得高效非常重要。

68820

CVE-2020-9971滥用XPC服务机制来提升macOS iOS中的特权

0x0 简介 在这篇博客中,将详细介绍在管理XPC服务时,在launchd进程中发现的一个有趣的逻辑漏洞,它很容易被利用,并且100%稳定获得macOS/iOS的高权限。..."只有拥有该域的进程可以修改它。即使是root也不能这样做。" 这个假设是有道理的,因为一个进程域应该只有它的所有者进程才能使用。...activation count = 0 security context = { uid unset asid = 100000 } ... } 对于开发者来说,不需要的创建进程域...,也不需要将XPC服务添加到域中去,libxpc框架会隐的为我们完成所有初始化阶段的工作。...在初始化阶段,libxpc框架会隐的为我们做所有的工作,但是在libxpc.com中仍然有一个api xpc_add_bundles_for_domain。

1.5K20

【一题】通过手写 koa 源码更加深入洋葱模型

当我们在深入学习一个框架或者库时,为了了解它的思想及设计思路,也为了更好使用和避免无意的 Bug,有时很有必要研究源码。对于 koa 这种极为简单,而应用却很广泛的框架/库更应该了解它的源码。...(3000) 构建 Application 首先完成 Appliacation 的大体框架: app.listen: 处理请求及响应,并且监听端口 app.use: 中间件函数,处理请求并完成响应 只有简单的十几行代码...http.createServer 的回调函数 use (middleware) { this.middleware = middleware } } 此时调用 Application...,现在就剩下一个最重要也是最核心的功能:洋葱模型 洋葱模型及中间件改造 上述工作只有简单的一个中间件,然而在现实中中间件会有很多个,如错误处理,权限校验,路由,日志,限流等等。...源码实现的仓库为:koa-mini

69330

分享 10 道 Nodejs 进程相关面试题

参考:Interview2 创建多进程时,代码里有 app.listen(port) 在进行 fork 时,为什么没有报端口被占用?...什么场景下需要用到 IPC 通信?参考:Interview4 Node.js 是单线程还是多线程?进一步会提问为什么是单线程?参考:Interview5 关于守护进程,是什么、为什么、怎么编写?..., pid: 32971, ppid: 1 Interview3 创建多进程时,代码里有 app.listen(port) 在进行 fork 时,为什么没有报端口被占用?...对守护进程做了一个说明,在实际工作中对守护进程的健壮性要求还是很高的,例如:进程的异常监听、工作进程管理调度、进程挂掉之后重启等等,这些还需要我们去不断思考。...多个 Web 服务也是一样的,还会出现在 A 机器上创建了 Session,当负载均衡分发到 B 机器上之后还需要在创建一份。一般的做法是通过 Redis 或者 数据库来做数据共享。

1.3K40

ping 与 traceroute 的工作原理分析

大家好,又见面了,是你们的朋友全栈君。...一、ping ping 程序的主要目的是测试主机是否可达,它发送 ICMP 回请求报文给目的主机,并等待返回 ICMP 回应答 ping 程序一般会周期性持续发送 ICMP...为什么 ping 第一次一般会产生更多耗时?...traceroute traceroute 程序的主要目的是获取从当前主机到目的主机所经过的路由 官方方案(TCP/IP详解里提供的基于 UDP 的方案):通过封装一份 UDP 数据报(指定一个不可能使用的端口...,就会返回一份端口不可达报文给源主机,源主机收到端口不可达报文,证明数据报已经到达了目的,停止后续的 UDP 数据报发送,将记录的路径依次打印出来,使命完成,结束任务。

77920
领券