websocket服务端实现,如何搭建websocket服务器
websocket服务端实现,如何搭建websocket服务器详细介绍
本文目录一览: WebSocket的简单实现
WebSocket协议是基于TCP的一种新的网络协议。 浏览器通信通常是基于HTTP 协议,为什么还需要另一个协议?因为http只能由客户端发起,不能由服务端发起。
而WebSocket 浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
WebSocket规范
WebSocket 协议本质上是一个基于 TCP 的协议。为了建立一个 WebSocket 连接,客户端浏览器首先要向服务器发起一个 HTTP 请求,这个请求和通常的 HTTP 请求不同,包含了一些附加头信息,附加信息如图所示
连接过程(以js(客户端)和java(服务器端)为例)
js:ws.send( String msg) ps:入参可以是字符串或者json字符串java:onMessage(String message)message为客户端传来的信息
java:sendUser( String msg) js:ws.onmessage
4.断开连接 onclose ( CloseReason reason)
CloseReason.CloseCode ( WebSocket关闭连接的状态码,类似http的404)
js部分:
java部分(javax实现):
ps: session 用来唯一标识连接对象
使用注解@ServerEndpoint
参考文献
javax websocket:(服务端实现api文档) https://tomcat.apache.org/tomcat-8.0-doc/websocketapi/javax/websocket/package-summary.html
js websocket:(客户端api文档) https://developer.mozilla.org/zh-CN/docs/Web/API/WebSocket
rfc6455 (websocket协议规范): https://datatracker.ietf.org/doc/rfc6455/ ** 产品介绍**
vue websocket是怎么实现即时通讯的?
还得有个后端服务器(固定IP地址)做websocket消息转发,只靠vue websocket搞不了的
Vue.js是一种流行的前端框架,它提供了一系列的工具和库,使得构建实时通信的Web应用程序变得容易。在Vue.js中,实现即时通讯的方式之一就是使用WebSocket。
WebSocket是一种基于TCP的协议,它允许在客户端和服务器之间进行双向通信。在Vue.js中,使用WebSocket可以实现以下的功能:
服务端和客户端之间的实时数据传输:WebSocket可以实现服务端向客户端实时推送数据,从而实现实时通讯。
长连接:WebSocket采用长连接的方式,使得客户端和服务端之间可以保持长时间的通讯,而不需要频繁地建立和关闭连接。
在Vue.js中,实现WebSocket通信的步骤如下:
在Vue.js应用程序中引入WebSocket库,如Socket.IO。
在Vue.js组件中创建WebSocket对象,指定连接的URL和其他选项。
通过WebSocket对象的方法,如send()方法,向服务端发送消息,并处理服务端返回的消息。
在Vue.js组件的生命周期函数中,对WebSocket进行初始化、连接、关闭等操作。
在使用Vue.js进行WebSocket通信时,需要注意以下几点:
WebSocket通信是基于事件的,需要注册事件处理函数来处理WebSocket的连接、断开连接、收到消息等事件。
在Vue.js组件中,可以使用data属性来维护WebSocket的连接状态和消息数据。
Vue.js中可以使用computed属性或watcher来处理WebSocket数据的变化,从而实现组件中数据的实时更新。
综上所述,Vue.js中通过WebSocket实现即时通讯的方式相对比较简单,但需要对WebSocket的原理和相关的事件、方法等有一定的了解。
websocket实现即时通讯怎么操作?
要使用WebSocket实现即时通讯,可以按照以下步骤进行操作:
1,打开浏览器并创建WebSocket对象:在需要与服务器进行通信的页面中添加JavaScript代码,创建WebSocket对象。
例如:
var ws = new WebSocket("ws://server_ip:port");
其中 "ws://server_ip:port" 是WebSocket服务器的地址和端口号。
2,监听WebSocket事件:为WebSocket对象添加事件监听器来处理与服务器的连接、消息接收等事件。例如:
ws.onopen = function() {
console.log("WebSocket连接已打开。");
};
ws.onmessage = function(event) {
console.log("收到消息:" + event.data);
};
ws.onclose = function() {
console.log("WebSocket连接已关闭。");
};
3,发送消息:使用WebSocket对象的send()方法向服务器发送消息。例如:
ws.send("Hello, Server!");
4,服务器端实现:在服务器端编写WebSocket服务端程序来处理来自客户端的连接请求、接收和发送消息等操作。
WebSocket是一种基于TCP协议的全双工通信协议,在实现即时通讯功能时具有优秀的性能和体验表现。以上只是简单介绍了WebSocket的基本操作流程,具体实现方式还需要根据具体需求和情况来调整和完善。
WebSocket是一种在Web浏览器和服务器之间建立持久连接的协议,用于实现实时通讯,其操作流程如下:
建立WebSocket连接:客户端通过浏览器向服务器发起WebSocket连接请求,服务器收到请求后生成唯一的标识符,表示该WebSocket连接,然后将标识符返回给客户端,建立连接。
发送消息:连接建立后,客户端和服务器可以相互发送消息,可以通过WebSocket API在客户端上发送消息,也可以在服务器端编写代码发送消息到客户端。
接收消息:客户端和服务器都可以在接收到消息后进行相应的处理,客户端可以通过WebSocket API监听来自服务器的消息,服务器也可以监听来自客户端的消息,然后根据不同的业务逻辑进行处理。
断开连接:当客户端或服务器不再需要WebSocket连接时,可以主动关闭连接,也可以等待连接超时自动关闭。在连接关闭之前,客户端和服务器可以相互发送消息。
总之,通过WebSocket可以在Web浏览器和服务器之间建立一种双向通信的机制,用于实现实时通讯。要实现WebSocket即时通讯,需要在客户端和服务器上分别编写代码,实现连接的建立、消息的发送和接收、连接的关闭等功能。
WebSocket的实现原理
Websocket是应用层第七层上的一个应用层协议,它必须依赖 HTTP 协议进行一次握手 ,握手成功后,数据就直接从 TCP 通道传输,与 HTTP 无关了。即:websocket分为握手和数据传输阶段,即进行了HTTP握手 + 双工的TCP连接。
下面我们分别来看一下这两个阶段的具体实现原理:
客户端发送消息:
服务端返回消息:
这里值得注意的是 Sec-WebSocket-Accept的计算方法 : base64(hsa1(sec-websocket-key + 258EAFA5-E914-47DA-95CA-C5AB0DC85B11)) 如果这个Sec-WebSocket-Accept计算错误浏览器会提示:Sec-WebSocket-Accept dismatch 如果返回成功,Websocket就会回调onopen事件
Websocket的数据传输是frame形式传输的,比如会将一条消息分为几个frame,按照先后顺序传输出去。这样做会有几个好处:
websocket传输使用的协议如下图:
参数说明如下:
我们了解了websocket的实现原理之后,请看以下golang的实现案例:
html和js使用案例:
WebSocket 的实现
长连接: 一个链接上可以连续发送多个数据包,在链接期间,如果没有数据包发送,需要双方发链路检查包
TCP/IP: TCP/IP 属于传输层,主要解决网络中的数据传输问题,只管传输数据。但这样对传输的数据没有一个规范的封装、解析等处理。使得传输的数据难以识别,所以才有了应用层协议对数据进行的封装、解析等,如http协议。
HTTP: HTTP协议是应用层协议,用于分装解析传输数据。 从HTTP1.1开始其实就默认开启了长链接,也就是请求头header中可以看到Connection:Keep-alive。但是长连接只是说保持了(服务器可以告诉客户端保持时间Keep-Alive:timeout=20;max=20;)这个TCP通道,并采用服务器和客户端应答模式(Request-Response),不需要再创建一个链接通道,做到一个性能优化。
socket: 与HTTP协议不一样,socket不是协议,他是在程序层面上对传输层协议(像TCP/IP)的接口封装。我们知道传输层的协议,是解决数据在网络中传输的问题的,那么socket(套接字)就是传输通道两端的接口。
Websocket: WebSocket是包装成了一个应用层协议作为socket,从而能够让客户端和远程服务端通过web建立全双工通信。
WebSocket API 是HTML5 推出的东西。在客户端我们可以通过HTML5 所提供的API 对websocket 进行创建、发送数据、监听信息、监听报错等功能( HTML5 WebSocket )
我们知道WebSocket 是在Socket的基础上实现的,所以我们要做的是对现有的Socket协议进行升级。
步骤: 客户端发送websocket请求-->服务端接受并识别该请求-->对该请求协议进行升级--> 返回给客户端 --> websocket 通道建立 --> 客户端/服务端发送数据
协议升级
在这里需要注意的是头部信息和头部信息中的Sec-Websocket-Accept的值。
该值需要是一个通过base64加密的哈希值(sha1)。 而该加密所用的数据是客户端传过来的sec-websocket-key的值和MAGIC_STRINC内的固定值。 对MAGIC_STRINC的说明
Webscoket 中传输的数据是 数据帧(frame)
数据帧有多种类型 主要有:文本型、二进制数据
数据帧结构
每一列代表一个字节,一个字节8位,每一位又代表一个二进制数。
创建数据帧
解数据帧
心跳检查
由于websocket 不进行交互会关闭通道所以,才有了心跳检查。
websocket与和他http的区别
基于node实现websocket协议
使用nodeJS在HTTP上实现WebSocket
如何让我的服务器返回正确的Sec-WebSocket-Accept标头值
学习WebSocket协议—从顶层到底层的实现原理
websocket 协议帧 解析
nodejs实现Websocket的数据接收发送
SpringBoot+Vue+Websocket 实现服务器端向客户端主动发送消息
本文通过一个实际的场景来介绍在前后端分离的项目中通过 WebSocket 来实现服务器端主动向客户端发送消息的应用。主要内容如下
Websocket 是一种在单个 TCP 连接上进行全双工通信的协议。WebSocket 连接成功后,服务端与客户端可以双向通信。在需要消息推送的场景,Websocket 相对于轮询能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。
具体如下特点
在客户端的列表数据中有个 status 字段,服务器端需要花费较长的时间进行处理,处理完成后才会更新对应数据的 status 字段值,通过 Websocket 的处理流程如下:
通过注入 ServerEndpointExporter 类,用于在项目启动的时候自动将使用了 @ServerEndpoint 注解声明的 Websocket endpoint 注册到 WebSocketContainer 中。
为什么增加一个 ServerEndpointExporter Bean,并通过在一个类上增加 @ServerEndpoint 和 @Component 注解就可以实现服务器端 Websocket 功能,这里简单解析一下。
java 定义了一套 javax.servlet-api, 一个 HttpServlet 就是一个 HTTP 服务。java websocket 并非基于 servlet-api 简单扩展, 而是新定义了一套 javax.websocket-api。
一个 websocket 服务对应一个 Endpoint。与 ServletContext 对应, websocket-api 也定义了 WebSocketContainer, 而编程方式注册 websocket 的接口是继承自 WebSocketContainer 的 ServerContainer。
一个 websocket 可以接受并管理多个连接, 因此可被视作一个 server。主流 servlet 容器都支持 websocket, 如 tomcat, jetty 等。看 ServerContainer api 文档, 可从 ServletContext attribute 找到 ServerContainer。
如何建立uniapp websocket服务端,要怎么实现?
其实现在有很多开源的websocket服务端组件,你自己多百度一下就可以找到。
使用这些开源的websocket服务端组件不好的地方是,很多功能都需要自己去做各种优化,要做的工作非常多。如果项目时间充裕可以考虑这种方式来实现。
如果项目时间紧,对websocket服务性能要求高,那可以考虑第三方的websocket推送服务。
我们前段时间在uniapp插件市场找到一款性能优异的websocket推送框架,对uniapp支持不错,算是uniapp生态体系里面非常优秀的一款框架了,推荐你去试试。框架地址:网页链接
SpringBoot整合Websocket实现即时聊天功能
近期,公司需要新增即时聊天的业务,于是用websocket 整合到Springboot完成业务的实现。
一、我们来简单的介绍下websocket的交互原理:
1.客户端先服务端发起websocket请求;
2.服务端接收到请求之后,把请求响应返回给客户端;
3.客户端与服务端只需要一次握手即可完成交互通道;
? 二、webscoket支持的协议:基于TCP协议下,http协议和https协议;
? http协议 springboot不需要做任何的配置?
? https协议则需要配置nignx代理,注意证书有效的问题? ---在这不做详细说明
? 三、开始我们的实现java后端的实现
? 1.添加依赖
?
? ? ? ?
? ? ? ? ? ?
org.springframework.boot
? ? ? ? ? ?
spring-boot-starter-websocket
? ? ? ?
? ? ? ?
? ? ? ? ? ?
org.springframework
? ? ? ? ? ?
spring-websocket
? ? ? ? ? ?
${spring.version}
? ? ? ?
? ? ? ?
? ? ? ? ? ?
org.springframework
? ? ? ? ? ?
spring-messaging
? ? ? ? ? ?
${spring.version}
? ? ? ?
? ? ? ?
? 2.配置config
@ConditionalOnWebApplication
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractSessionWebSocketMessageBrokerConfigurer {
? ? @Bean
? ? public ServerEndpointExporter serverEndpointExporter(){
? ? ? ? return? new ServerEndpointExporter();
? ? }
? ? @Bean
? ? public CustomSpringConfigurator customSpringConfigurator() {
? ? ? ? return new CustomSpringConfigurator();
? ? }
? ? @Override
? ? protected void configureStompEndpoints(StompEndpointRegistry registry) {
? ? ? ? registry.addEndpoint("/websocket").setAllowedOrigins("*")
? ? ? ? ? ? ? ? .addInterceptors(new HttpSessionHandshakeInterceptor()).withSockJS();
? ? }
public class CustomSpringConfigurator extends ServerEndpointConfig.Configurator implements ApplicationContextAware {
? ? private static volatile BeanFactory context;
? ? @Override
? ? public
T getEndpointInstance(Class
clazz) throws InstantiationException {
? ? ? ? return context.getBean(clazz);
? ? }
? ? @Override
? ? public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
? ? ? ? CustomSpringConfigurator.context = applicationContext;
? ? }
? ? @Override
? ? public void modifyHandshake(ServerEndpointConfig sec,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? HandshakeRequest request, HandshakeResponse response) {
? ? ? ? super.modifyHandshake(sec,request,response);
? ? ? ? HttpSession httpSession=(HttpSession) request.getHttpSession();
? ? ? ? if(httpSession!=null){
? ? ? ? ? ? sec.getUserProperties().put(HttpSession.class.getName(),httpSession);
? ? ? ? }
? ? }
}
@SpringBootApplication
@EnableCaching
@ComponentScan("com")
@EnableWebSocket
public class Application extends SpringBootServletInitializer {
static final Logger logger = LoggerFactory.getLogger(Application.class);
? ? @Override
? ? protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
? ? ? ? return application.sources(Application.class);
? ? }
需要注意的是: @EnableWebSocket? 一定要加在启动类上,不然springboot无法对其扫描进行管理;
@SeverEndpoint --将目标类定义成一个websocket服务端,注解对应的值将用于监听用户连接的终端访问地址,客户端可以通过URL来连接到websocket服务端。
四、设计思路:用map
来保存房间对应的用户连接列表,当有用户进入一个房间的时候,就会先检测房间是否存在,如果不存在那就新建一个空的用户set,再加入本身到这个set中,确保不同房间号里的用户session不串通!
/**
* Create by wushuyu
* on 2020/4/30 13:24
*
*/
@ServerEndpoint(value = "/websocket/{roomName}", configurator = CustomSpringConfigurator.class)
@Component
public class WebSocketRoom {
? ? //连接超时--一天
? ? private static final long MAX_TIME_OUT = 24*60*60*1000;
? ? // key为房间号,value为该房间号的用户session
? ? private static final Map
<string, set
> rooms = new ConcurrentHashMap<>();
? ? //将用户的信息存储在一个map集合里
? ? private static final Map
users = new ConcurrentHashMap<>();
/**
*{roomName} 使用通用跳转,实现动态获取房间号和用户信息? 格式:roomId|xx|xx
*/
? ? @OnOpen?
? ? public void connect(@PathParam("roomName") String roomName, Session session) {
? ? ? ? String roomId = roomName.split("[|]")[0];
? ? ? ? String nickname = roomName.split("[|]")[1];
? ? ? ? String loginId = roomName.split("[|]")[2];
? ? ? ? //设置连接超时时间
? ? ? ? ? ? session.setMaxIdleTimeout(MAX_TIME_OUT);
? ? ? ? try {
? ? ? ? ? //可实现业务逻辑
? ? ? ? ? ? }
? ? ? ? ? ? // 将session按照房间名来存储,将各个房间的用户隔离
? ? ? ? ? ? if (!rooms.containsKey(roomId)) {
? ? ? ? ? ? ? ? // 创建房间不存在时,创建房间
? ? ? ? ? ? ? ? Set
room = new HashSet<>();
? ? ? ? ? ? ? ? // 添加用户
? ? ? ? ? ? ? ? room.add(session);
? ? ? ? ? ? ? ? rooms.put(roomId, room);
? ? ? ? ? ? } else { // 房间已存在,直接添加用户到相应的房间? ? ? ? ? ? ?
? ? ? ? ? ? ? ? if (rooms.values().contains(session)) {//如果房间里有此session直接不做操作
? ? ? ? ? ? ? ? } else {//不存在则添加
? ? ? ? ? ? ? ? ? ? rooms.get(roomId).add(session);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? JSONObject jsonObject = new JSONObject();
? ? ? ? ? ? -----
? ? ? ? ? ? //根据自身业务情况实现业务
? ? ? ? ? ? -----
? ? ? ? ? ? users.put(session.getId(), jsonObject);
? ? ? ? ? ? //向在线的人发送当前在线的人的列表? ? -------------可有可无,看业务需求
? ? ? ? ? ? List
userList = new LinkedList<>();
? ? ? ? ? ? rooms.get(roomId)
? ? ? ? ? ? ? ? ? ? .stream()
? ? ? ? ? ? ? ? ? ? .map(Session::getId)
? ? ? ? ? ? ? ? ? ? .forEach(s -> {
? ? ? ? ? ? ? ? ? ? ? ? ChatMessage chatMessage = new ChatMessage();
? ? ? ? ? ? ? ? ? ? ? ? chatMessage.setDate(new Date());
? ? ? ? ? ? ? ? ? ? ? ? chatMessage.setStatus(1);
? ? ? ? ? ? ? ? ? ? ? ? chatMessage.setChatContent(users.get(s));
? ? ? ? ? ? ? ? ? ? ? ? chatMessage.setMessage("");
? ? ? ? ? ? ? ? ? ? ? ? userList.add(chatMessage);
? ? ? ? ? ? ? ? ? ? });
//? ? ? ? session.getBasicRemote().sendText(JSON.toJSONString(userList));
? ? ? ? ? ? //向房间的所有人群发谁上线了
? ? ? ? ? ? ChatMessage chatMessage = new ChatMessage();? ----将聊天信息封装起来。
? ? ? ? ? ? chatMessage.setDate(new Date());
? ? ? ? ? ? chatMessage.setStatus(1);
? ? ? ? ? ? chatMessage.setChatContent(users.get(session.getId()));
? ? ? ? ? ? chatMessage.setMessage("");
? ? ? ? ? ? broadcast(roomId, JSON.toJSONString(chatMessage));
? ? ? ? ? ? broadcast(roomId, JSON.toJSONString(userList));
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }
? ? @OnClose
? ? public void disConnect(@PathParam("roomName") String roomName, Session session) {
? ? ? ? String roomId = roomName.split("[|]")[0];
? ? ? ? String loginId = roomName.split("[|]")[2];
? ? ? ? try {
? ? ? ? ? ? rooms.get(roomId).remove(session);
? ? ? ? ? ? ChatMessage chatMessage = new ChatMessage();
? ? ? ? ? ? chatMessage.setDate(new Date());
? ? ? ? ? ? chatMessage.setUserName(user.getRealname());
? ? ? ? ? ? chatMessage.setStatus(0);
? ? ? ? ? ? chatMessage.setChatContent(users.get(session.getId()));
? ? ? ? ? ? chatMessage.setMessage("");
? ? ? ? ? ? users.remove(session.getId());
? ? ? ? ? ? //向在线的人发送当前在线的人的列表? ----可有可无,根据业务要求
? ? ? ? ? ? List
userList = new LinkedList<>();
? ? ? ? ? ? rooms.get(roomId)
? ? ? ? ? ? ? ? ? ? .stream()
? ? ? ? ? ? ? ? ? ? .map(Session::getId)
? ? ? ? ? ? ? ? ? ? .forEach(s -> {
? ? ? ? ? ? ? ? ? ? ? ? ChatMessage chatMessage1 = new ChatMessage();
? ? ? ? ? ? ? ? ? ? ? ? chatMessage1.setDate(new Date());
? ? ? ? ? ? ? ? ? ? ? ? chatMessage1.setUserName(user.getRealname());
? ? ? ? ? ? ? ? ? ? ? ? chatMessage1.setStatus(1);
? ? ? ? ? ? ? ? ? ? ? ? chatMessage1.setChatContent(users.get(s));
? ? ? ? ? ? ? ? ? ? ? ? chatMessage1.setMessage("");
? ? ? ? ? ? ? ? ? ? ? ? userList.add(chatMessage1);
? ? ? ? ? ? ? ? ? ? });
? ? ? ? ? ? broadcast(roomId, JSON.toJSONString(chatMessage));
? ? ? ? ? ? broadcast(roomId, JSON.toJSONString(userList));
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }
? ? @OnMessage
? ? public void receiveMsg( String msg, Session session) {
? ? ? ? try {
? ? ? ? ? ? ? ? ChatMessage chatMessage = new ChatMessage();
? ? ? ? ? ? ? ? chatMessage.setUserName(user.getRealname());
? ? ? ? ? ? ? ? chatMessage.setStatus(2);
? ? ? ? ? ? ? ? chatMessage.setChatContent(users.get(session.getId()));
? ? ? ? ? ? ? ? chatMessage.setMessage(msg);
? ? ? ? ? ? ? ? // 按房间群发消息
? ? ? ? ? ? ? ? broadcast(roomId, JSON.toJSONString(chatMessage));
? ? ? ? ? ? }
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }
? ? // 按照房间名进行群发消息
? ? private void broadcast(String roomId, String msg) {
? ? ? ? rooms.get(roomId).forEach(s -> {
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? s.getBasicRemote().sendText(msg);? -----此还有一个getAsyncRemote()?
? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? }
? ? ? ? });
? ? }
? ? @OnError
? ? public void onError(Throwable error) {
? ? ? ? error.printStackTrace();
? ? }
}
友情提示:此session是websocket里的session,并非httpsession;
房间id,>
如何搭建websocket服务器
在服务器的选择上很广,基本上,主流语言都有WebSocket的服务器端实现,而我们作为前端开发工程师,当然要选择现在比较火热的NodeJS作为我们的服务器端环境了。
NodeJS本身并没有原生的WebSocket支持,但是有第三方的实现(大家要是有兴趣的话,完全可以参考WebSocket协议来做自己的实现),我们选择了“ws”作为我们的服务器端实现。
由于本文的重点是讲解WebSocket,所以,对于NodeJS不做过多的介绍,不太熟悉的朋友可以去参考NodeJS入门指南(http://www.nodebeginner.org/index-zh-cn.html)。
安装好NodeJS之后,我们需要安装“ws”,也就是我们的WebSocket实现,安装方法很简单,在终端或者命令行中输入:
npm install ws
,等待安装完成就可以了。
接下来,我们需要启动我们的WebSocket服务。首先,我们需要构建自己的HTTP服务器,在NodeJS中构建一个简单的HTTP服务器很简单,so easy。代码如下:
var app = http.createServer(onRequest ).listen( 8888 );
onRequest()作为回调函数,它的作用是处理请求,然后做出响应,实际上就是根据接收的URL,在服务器上查找相应的资源,最终返回给浏览器。
在构建了HTTP服务器后,我们需要启动WebSocket服务,代码如下:
var WebSocketServer = require('ws').Server;
var wss = new WebSocketServer( { server : app } );
从代码中可以看出,在初始化WebSocket服务时,把我们刚才构建好的HTTP实例传递进去就好。到这里,我们的服务端代码差不多也就编写完成了。