如何使用SpringBoot和Netty实现一个WebSocket服务器,并配合Vue前端实现聊天功能?

简介: 如何使用SpringBoot和Netty实现一个WebSocket服务器,并配合Vue前端实现聊天功能?

本文将详细介绍如何使用SpringBoot和Netty实现一个WebSocket服务器,并配合Vue前端实现聊天功能。

WebSocket是一种基于TCP的协议,它允许客户端和服务器之间进行双向通信,而不需要像HTTP那样进行请求和响应。Netty是一个Java网络编程框架,它提供了强大的异步事件驱动网络编程能力。SpringBoot是一个快速开发框架,它为开发者提供了丰富的自动化配置和依赖注入功能。

结合这三个工具,我们可以轻松地搭建一个高效、稳定的WebSocket服务器,并实现实时聊天功能。

准备工作

在开始本文的实践部分之前,有一些准备工作需要做好:

  1. 安装Node.js和Vue CLI
  2. 熟悉JavaScript和Vue.js框架
  3. 熟悉Java和SpringBoot框架

实践步骤

1. 创建SpringBoot项目

首先,我们需要创建一个SpringBoot项目。可以使用Spring Initializr或者IDEA等工具来创建一个基础的SpringBoot项目。

2. 添加Netty依赖

在pom.xml文件中添加以下依赖:

<dependency>
    <groupId>io.netty</groupId>
    <artifactId>netty-all</artifactId>
    <version>4.1.53.Final</version>
</dependency>

以上代码会添加Netty的依赖。

3. 创建WebSocket服务器

接下来,我们需要创建一个WebSocket服务器。创建一个名为WebSocketServer的类,并继承ChannelInboundHandlerAdapter类:

public class WebSocketServer extends ChannelInboundHandlerAdapter {
   
}

在该类中,我们需要实现以下方法:

@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
   
    // 处理消息
}

@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
   
    // 客户端连接建立时触发
}

@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
   
    // 客户端连接断开时触发
}

channelActive方法中,我们可以获取客户端的连接,并保存到一个列表中:

@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
   
    Channel incoming = ctx.channel();
    System.out.println("Client: " + incoming.remoteAddress() + " 连接成功");
    ChatSession.add(incoming);
}

channelInactive 方法中,从列表中移除断开连接的客户端:

@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
   
    Channel incoming = ctx.channel();
    System.out.println("Client: " + incoming.remoteAddress() + " 断开连接");
    ChatSession.remove(incoming);
}

channelRead 方法中处理消息,例如读取客户端发送过来的消息并进行广播:

@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
   
    String message = (String) msg;
    System.out.println("接收到客户端消息: " + message);
    ChatSession.broadcast(message);
}

ChatSession是一个帮助我们管理所有客户端连接的工具类。在该类中,我们可以定义一个静态列表 channels 来保存所有连接:

public class ChatSession {
   
    private static final List<Channel> channels = new CopyOnWriteArrayList<>();

    public static void add(Channel incoming) {
   
        channels.add(incoming);
    }

    public static void remove(Channel incoming) {
   
        channels.remove(incoming);
    }

    public static void broadcast(String message) {
   
        for (Channel channel : channels) {
   
            channel.writeAndFlush(message + "\n");
        }
    }
}

以上代码会将接收到的消息进行广播,即向所有客户端发送同样的消息。

4. 创建WebSocket处理器

在上一步中,我们已经创建了一个WebSocket服务器,但是它并没有实现WebSocket的协议。为了实现WebSocket协议,我们需要使用Netty提供的WebSocketServerProtocolHandler类。

WebSocketServer中添加以下代码:

@Override
public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
   
    ChannelPipeline pipeline = ctx.pipeline();
    pipeline.addLast(new HttpServerCodec());
    pipeline.addLast(new HttpObjectAggregator(65536));
    pipeline.addLast(new WebSocketServerProtocolHandler("/chat"));
    pipeline.addLast(new WebSocketFrameHandler());
}

以上代码将向当前的ChannelPipeline添加了四个处理器:

  • HttpServerCodec:用于解析HTTP请求和响应。
  • HttpObjectAggregator:用于将HTTP消息的多个部分聚合成一个完整的HTTP消息。
  • WebSocketServerProtocolHandler:用于实现WebSocket协议。
  • WebSocketFrameHandler:自定义的处理器,用于读取WebSocket帧并转发给所有客户端。

5. 实现WebSocket帧处理器

接下来,我们需要实现自定义的WebSocketFrameHandler处理器。该处理器会被添加到WebSocketServer的ChannelPipeline中,并负责读取WebSocket帧并将其转发给所有客户端。

public class WebSocketFrameHandler extends SimpleChannelInboundHandler<WebSocketFrame> {
   
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, WebSocketFrame frame) throws Exception {
   
        if (frame instanceof TextWebSocketFrame) {
   
            String message = ((TextWebSocketFrame) frame).text();
            ChatSession.broadcast(message);
        } else {
   
            System.out.println("Unsupported frame type: " + frame.getClass().getName());
        }
    }
}

以上代码会读取WebSocket帧,并将其转换为文本消息。如果是文本消息,就会调用ChatSession.broadcast()方法进行广播。

6. 创建Vue前端

在这个项目中,我们使用Vue.js框架创建一个简单的前端,它将连接到我们刚才创建的WebSocket服务器,并实现实时聊天功能。

首先,创建一个Vue项目:

vue create chat-client

在新创建的项目中,安装vue-socket.iosocket.io-client

npm install vue-socket.io socket.io-client --save

修改src/main.js文件,添加以下代码:

import VueSocketIO from 'vue-socket.io'
import SocketIO from 'socket.io-client'

Vue.use(
  new VueSocketIO({
   
    debug: true,
    connection: SocketIO('http://localhost:8080/chat')
  })
)

以上代码会创建一个Socket.IO客户端,并连接到http://localhost:8080/chat地址上。然后,我们可以使用this.$socket对象来发送和接收消息。

在组件中添加以下代码:

<template>
  <div>
    <input type="text" v-model="message" @keyup.enter="sendMessage" />
    <ul>
      <li v-for="(message, index) in messages" :key="index">{
  { message }}</li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: '',
      messages: []
    }
  },
  methods: {
    sendMessage() {
      this.$socket.emit('message', this.message)
      this.message = ''
    }
  },
  sockets: {
    message(message) {
      this.messages.push(message)
    }
  }
}
</script>

以上代码会渲染一个输入框和一个消息列表。当用户输入消息并按下回车键时,会调用sendMessage()方法发送消息。当接收到新消息时,会将其添加到消息列表中。

7. 运行项目

在本地运行后端服务器:

mvn spring-boot:run

在另一个终端窗口中运行前端应用:

npm run serve

现在,可以在浏览器中访问应用了:http://localhost:8081。在多个浏览器窗口或标签页中打开该地址,并尝试向其他客户端发送消息。

总结

本文介绍了如何使用SpringBoot和Netty实现一个WebSocket服务器,并结合Vue前端实现了实时聊天功能。通过使用Netty的高效异步网络编程能力,我们可以轻松地构建一个高性能、高可靠性的WebSocket服务器。

在实践中,我们学习了如何使用Netty处理WebSocket协议,以及如何使用Vue.js框架创建一个简单的前端应用程序。我们还探讨了一些重要的主题,如如何管理客户端连接和广播消息。

这个项目是一个很好的开始点,你可以使用它作为模板来构建更复杂的WebSocket应用程序。

目录
相关文章
|
JavaScript 前端开发 Java
制造业ERP源码,工厂ERP管理系统,前端框架:Vue,后端框架:SpringBoot
这是一套基于SpringBoot+Vue技术栈开发的ERP企业管理系统,采用Java语言与vscode工具。系统涵盖采购/销售、出入库、生产、品质管理等功能,整合客户与供应商数据,支持在线协同和业务全流程管控。同时提供主数据管理、权限控制、工作流审批、报表自定义及打印、在线报表开发和自定义表单功能,助力企业实现高效自动化管理,并通过UniAPP实现移动端支持,满足多场景应用需求。
1251 1
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
756 70
|
网络协议 Java
在SpringBoot项目中使用Netty实现远程调用
本文介绍了使用Netty解决网络连接性能问题的方法,重点讲解了Netty的NIO特性及其在SpringBoot中的应用。Netty作为高效的NIO框架,支持非阻塞IO,能通过单线程管理多个客户端连接,简化TCP/UDP套接字服务器开发。文章详细展示了Netty在SpringBoot中实现远程调用的过程,包括服务端与客户端代码实现、依赖配置及测试验证。通过示例代码,如`NettyServer`、`NettyClientUtil`等,清晰说明了Netty的工作原理和实际应用,解决了半包等问题,并提供了完整的测试结果。
1037 3
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
XML Java 应用服务中间件
Spring Boot 两种部署到服务器的方式
本文介绍了Spring Boot项目的两种部署方式:jar包和war包。Jar包方式使用内置Tomcat,只需配置JDK 1.8及以上环境,通过`nohup java -jar`命令后台运行,并开放服务器端口即可访问。War包则需将项目打包后放入外部Tomcat的webapps目录,修改启动类继承`SpringBootServletInitializer`并调整pom.xml中的打包类型为war,最后启动Tomcat访问应用。两者各有优劣,jar包更简单便捷,而war包适合传统部署场景。需要注意的是,war包部署时,内置Tomcat的端口配置不会生效。
3271 17
Spring Boot 两种部署到服务器的方式
|
JavaScript 前端开发 Java
Spring Boot 与 Vue.js 前后端分离中的数据交互机制
本文深入探讨了Spring Boot与Vue.js在前后端分离架构下的数据交互机制。通过对比传统`model.addAttribute()`方法与RESTful API的设计,分析了两者在耦合性、灵活性及可扩展性方面的差异。Spring Boot以RESTful API提供数据服务,Vue.js借助Axios消费API并动态渲染页面,实现了职责分明的解耦架构。该模式显著提升了系统的灵活性和维护性,适用于复杂应用场景如论坛、商城系统等,为现代Web开发提供了重要参考。
1457 0
|
JavaScript 前端开发 Java
springboot解决js前端跨域问题,javascript跨域问题解决
本文介绍了如何在Spring Boot项目中编写Filter过滤器以处理跨域问题,并通过一个示例展示了使用JavaScript进行跨域请求的方法。首先,在Spring Boot应用中添加一个实现了`Filter`接口的类,设置响应头允许所有来源的跨域请求。接着,通过一个简单的HTML页面和jQuery发送AJAX请求到指定URL,验证跨域请求是否成功。文中还提供了请求成功的响应数据样例及请求效果截图。
410 3
springboot解决js前端跨域问题,javascript跨域问题解决
|
监控 IDE Java
如何在无需重新启动服务器的情况下在 Spring Boot 上重新加载我的更改?
如何在无需重新启动服务器的情况下在 Spring Boot 上重新加载我的更改?
1665 8
|
存储 缓存 NoSQL
跟着源码学IM(十一):一套基于Netty的分布式高可用IM详细设计与实现(有源码)
本文将要分享的是如何从零实现一套基于Netty框架的分布式高可用IM系统,它将支持长连接网关管理、单聊、群聊、聊天记录查询、离线消息存储、消息推送、心跳、分布式唯一ID、红包、消息同步等功能,并且还支持集群部署。
14099 1
|
算法 Java 容器
Netty源码—4.客户端接入流程
本文主要介绍了关于Netty客户端连接接入问题整理、Reactor线程模型和服务端启动流程、Netty新连接接入的整体处理逻辑、新连接接入之检测新连接、新连接接入之创建NioSocketChannel、新连接接入之绑定NioEventLoop线程、新连接接入之注册Selector和注册读事件、注册Reactor线程总结、新连接接入总结

热门文章

最新文章