基于Java实现互联网实时聊天系统(附源码)

目录
  • 0. 前言
  • 1、技术准备
  • 2. 整体说明
    • 2.1 设计思想
    • 2.2 系统结构
    • 2.3 项目结构
    • 2.4 系统功能模块
    • 2.5 系统界面
  • 3. 核心编码
    • 3.1 Netty服务器启动与关闭
  • 4. 效果及操作演示
    • 4.1 登录操作
    • 4.2 聊天演示
  • 5. 源码下载

0. 前言

决定以Netty为核心,以WebSocket为应用层通信协议做一个互联网聊天系统,整体而言就像微信网页版一样,但考虑到这个聊天系统的功能非常多,因此只打算实现核心的聊天功能,包括单发、群发、文件发送,然后把项目与Spring整合做成开源、可拓展的方式,给大家参考、讨论、使用,欢迎大家的指点。

关于Netty

Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架。

关于WebSocket通信协议

WebSocket是为了解决HTTP协议中通信只能由客户端发起这个弊端而出现的,WebSocket基于HTTP5协议,借用HTTP进行握手、升级,能够做到轻量的、高效的、双向的在客户端和服务端之间传输文本数据。

1、技术准备

IDE:MyEclipse 2016

JDK版本:1.8.0_121

浏览器:谷歌浏览器、360浏览器(极速模式)(涉及网页前端设计,后端开发表示很苦闷)

涉及技术:

  • Netty 4
  • WebSocket + HTTP
  • Spring MVC + Spring
  • JQuery
  • Bootstrap 3 + Bootstrap-fileinput
  • Maven 3.5
  • Tomcat 8.0

2. 整体说明

2.1 设计思想

整个通信系统以Tomcat作为核心服务器运行,其下另开一个线程运行Netty WebSocket服务器,Tomcat服务器主要处理客户登录、个人信息管理等的HTTP类型请求(通常的业务类型),端口为8080,Netty WebSockt服务器主要处理用户消息通信的WebSocket类型请求,端口为3333。用户通过浏览器登录后,浏览器会维持一个Session对象(有效时间30分钟)来保持登录状态,Tomcat服务器会返回用户的个人信息,同时记录在线用户,根据用户id建立一条WebSocket连接并保存在后端以便进行实时通信。当一个用户向另一用户发起通信,服务器会根据消息内容中的对话方用户id,找到保存的WebSocket连接,通过该连接发送消息,对方就能够收到即时收到消息。当用户注销或退出时,释放WebSocket连接,清空Session对象中的登录状态。(插播一条广告:需要开通正版IDEA的可以联系我,56元一年,正版授权激活,官网可查有效期,有需要的加我微信:poxiaozhiai6,备注:914。)

事实上Netty也可以用作一个HTTP服务器,而这里使用Spring MVC处理HTTP请求是出于熟悉的缘故,也比较接近传统开发的方式。

2.2 系统结构

系统采用B/S(Browser/Server),即浏览器/服务器的结构,主要事务逻辑在服务器端(Server)实现。借鉴MVC模式的思想,从上至下具体又分为视图层(View)、控制层(Controller)、业务层(Service)、模型层(Model)、数据访问层(Data Access)

2.3 项目结构

项目后端结构:

项目前端结构:

2.4 系统功能模块

系统只包括两个模块:登录模块和聊天管理模块。

  • 登录模块:既然作为一个系统,那么登录的角色认证是必不可少的,这里使用简单、传统的Session方式维持登录状态,当然也有对应的注销功能,但这里的注销除了清空Session对象,还要释放WebSocket连接,否则造成内存泄露。
  • 聊天管理模块:系统的核心模块,这部分主要使用Netty框架实现,功能包括信息、文件的单条和多条发送,也支持表情发送。
  • 其他模块:如好友管理模块、聊天记录管理、注册模块等,我并没有实现,有兴趣的话可以自行实现,与传统的开发方式类似。

由于本系统涉及多个用户状态,有必要进行说明,下面给出本系统的用户状态转换图。

2.5 系统界面

系统聊天界面如下:

3. 核心编码

这里只说明需要注意的地方,详细的请看源码

3.1 Netty服务器启动与关闭

当关闭Tomcat服务器时,也要释放Netty相关资源,否则会造成内存泄漏,关闭方法如下面的close(),如果只是使用shutdownGracefully()方法的话,关闭时会报内存泄露Memory Leak异常(但IDE可能来不及输出到控制台)

/**
 * 描述: Netty WebSocket服务器
 *      使用独立的线程启动
 * @author Kanarien
 * @version 1.0
 * @date 2018年5月18日 上午11:22:51
 */
public class WebSocketServer implements Runnable{

        /**
  * 描述:启动Netty Websocket服务器
  */
 public void build() {
     // 略,详细请看源码
 }

      /**
  * 描述:关闭Netty Websocket服务器,主要是释放连接
  *     连接包括:服务器连接serverChannel,
  *     客户端TCP处理连接bossGroup,
  *     客户端I/O操作连接workerGroup
  *
  *     若只使用
  *         bossGroupFuture = bossGroup.shutdownGracefully();
  *         workerGroupFuture = workerGroup.shutdownGracefully();
  *     会造成内存泄漏。
  */
 public void close(){
     serverChannelFuture.channel().close();
  Future<?> bossGroupFuture = bossGroup.shutdownGracefully();
        Future<?> workerGroupFuture = workerGroup.shutdownGracefully();

        try {
            bossGroupFuture.await();
            workerGroupFuture.await();
        } catch (InterruptedException ignore) {
            ignore.printStackTrace();
        }
 }

}

4. 效果及操作演示

4.1 登录操作

登录入口为:http://localhost:8080/WebSocket/login 或 http://localhost:8080/WebSocket/ 当前系统用户固定为9个,群组1个,包括9人用户。

  • 用户1 用户名:Member001 密码:001
  • 用户2 用户名:Member002 密码:002
  • ······
  • 用户9 用户名:Member009 密码:009

4.2 聊天演示

5. 源码下载

下载链接: https://pan.baidu.com/s/1JuXRqWH0HFN0ruMm-BnysA

提取码: e9ej

以上就是基于Java实现互联网实时聊天系统(附源码)的详细内容,更多关于Java实时聊天系统的资料请关注我们其它相关文章!

(0)

相关推荐

  • Java NIO实现聊天系统

    使用Java的NIO写的一个小的聊天系统,供大家参考,具体内容如下 一.服务端 /** * 群聊的服端 * * @author :breakpoint/赵立刚 * @date : 2020/08/13 */ public class GroupChatServer { // 定义相关的属性 private Selector selector; private ServerSocketChannel listenChannel; private static final int port = 66

  • Java网络编程实例——简单模拟在线聊天

    1.前提知识 需要知道简单的IO流操作,以及简单的UDP发送数据包的原理. 需要用到的类:DatagramSocket.DatagramPacket UDP数据包基于DatagramSocket发送和接收,DatagramPacket用于封装数据包 看下案例: 客户端发送消息: 正常情况下从控制台读信息,封装到DatagramPacket之中,再由DatagramSocket的send方法发出 读取到bye的时候退出聊天 public class UdpOnlineClient { public

  • Java中使用websocket实现在线聊天功能

    很早以前为了快速达到效果,使用轮询实现了在线聊天功能,后来无意接触了socket,关于socket我的理解是进程间通信,首先要有服务器跟客户端,服务的启动监听某ip端口定位该进程,客户端开启socket分配ip端口连接服务端ip端口,于是两个进程间便可以通信了.下面简单画个图理解. but,今天还是准备分享websocket的使用,先上效果,再贴代码. 第一步启动socket服务. 然后连接客户端连接服务器,加入聊天室,分别使用googel(白玉京,沈浪),火狐(楚留香),ie(李寻欢)进行测试

  • Java网络编程UDP实现多线程在线聊天

    本文实例为大家分享了Java实现多线程在线聊天的具体代码,供大家参考,具体内容如下 上一篇博客通过UDP实现了聊天,但只能单方面发送消息,这次实现了多线程在线聊天,也就是可以双方互发消息. 发送消息: package com.kuang.chat; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.DatagramPacket;

  • Java GUI编程实现在线聊天室

    引言 综合应用Java的GUI编程和网络编程,实现一个能够支持多组用户同时使用的聊天室软件.该聊天室具有比较友好的GUI界面,并使用C/S模式,支持多个用户同时使用,用户可以自己选择加入或者创建房间,和房间内的其他用户互发信息(文字和图片) 主要功能 客户端的功能主要包括如下的功能: 选择连上服务端 显示当前房间列表(包括房间号和房间名称) 选择房间进入 多个用户在线群聊 可以发送表情(用本地的,实际上发送只发送表情的代码) 退出房间 选择创建房间 房间里没人(房主退出),导致房间解散 显示系统

  • Java 网络编程之 TCP 实现简单的聊天系统

    客户端 1.连接服务器 Socket 2.发送消息 package lesson02; import java.io.IOException; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; /** * 客户端 */ public class TcpClientDemo1 { public static void main(String[] args) { Socket socke

  • Java使用TCP实现在线聊天的示例代码

    客户端的代码: package tcp.http; import java.io.*; import java.net.*; import java.util.Scanner; public class Client{ public static void main(String[] args) throws IOException{ Scanner scanner=new Scanner(System.in); //1.创建Socket Socket tcpClientSocket=new S

  • Java Socket实现多人聊天系统

    本文实例为大家分享了Java Socket实现多人聊天系统的具体代码,供大家参考,具体内容如下 前言 GitHub地址 开发环境:Eclipse Java 2019-06 注意:本项目只在单主机运行调试过,没试过在局域网和不同主机之间接发消息和文件(估计不行),有需要的自行查阅资料. 一.多人聊天系统 1.1 客户端 Login.java:登录界面 // Login.java package exp5; import java.awt.*; import javax.swing.*; publi

  • java实现在线聊天系统

    本文实例为大家分享了java实现在线聊天系统的具体代码,供大家参考,具体内容如下 本博客是博主在观看相关视频后写下的代码,希望能够帮助大家掌握java socket的相关知识. 原理介绍 代码展示 原理介绍 一.搭建服务器端 a).创建ServerSocket对象绑定监听端口.b).通过accept()方法监听客户端的请求.c).建立连接后,通过输入输出流读取客户端发送的请求信息.d).通过输出流向客户端发送请求信息.e).关闭相关资源. 二.搭建客户器端 a).创建Socket对象,指明需要连

  • 基于Java网络编程和多线程的多对多聊天系统

    1.前言 程序实现基于星型结构(服务器接收来自各个客户端发送的信息,然后将信息传递给其他客户端界面并在其他客户端界面显示发送的信息) 2.类图 3.代码 客户端代码: package netProgram; import java.io.IOException; import java.net.Socket; import java.net.SocketAddress; public class Client implements ScreenInputInterface{ private So

随机推荐