基于Socket,Swing,Mybatis简易即时聊天系统
前言
为了记录下计算机网络课设中遇到的一些问题和我的思考,特此写下了这篇文章。如有纰漏还望指出。在一开始写这个课设的时候,脑中都是偷懒的想法。想着应付该课设。如果有这种想法的,我想说emmm其实不会简单多少。我想着使用网上提供的各种即时通讯SDK,然而配置起来似乎也很麻烦,遂放弃了。这于是个时候突然看到了how2j的java中级中有讲到socket编程,然后其中的实例正好是个聊天的例子。便浏览了一番,配合着脑海中的一些印象和站长的讲解。搭建了初步的模型然后一步步的进行了实现。那么不说废话,切入正题。
技术分析
基本构建
首先我们脑海中要现有一个基本的通讯模式,那就是C/S模式。我们都是通过客户端向服务器转发信息然后服务器对我们的信息进行转发到对应的客户端。说到这里就有了一个初步的架构就应该建立了,我们要设置一个服务端,多个客户端。服务端能同时对多个客户端做出响应。我们以此为基础进一步细化。
工具选择
因为对java比较熟悉加之想一个GUI的应用遂想到了使用Swing。然后这个系统自然是会使用到数据库便想到使用Mybatis。至于实现C/S交互则使用Socket来实现,利用java中的Socket编程。
功能分析
我们先从服务器来分析,服务器需要有哪些功能呢?首先是对指定端口的监听,而且要对所有有请求的用户来响应。我们不能阻塞服务器的响应,即对所有的用户响应应该都是实时的。所有我们需要为所有的连接的用户单独开一个线程来进行响应。然后每个线程就来处理用户的各种请求,如注册,登录,消息转发。
注册和登录
注册和登录的处理过程是相似的,都是对同一个客户端进行接收和响应的过程,不会涉及到其它的线程。我的初步处理是这样的,只有当用户提交信息时再与服务器建立连接。当用户登录成功后才真正的为用户建立线程否则不进行建立。那么我们就应该将注册和登陆的后台模块与其它的模块进行分离。而且在逻辑顺序上应该是先与其它模块的。
消息的转发
我们先来说说私聊也就是用户之间的消息传递,在我的设计中。用户是能够和多个用户之间进行聊天的,那么也就是说客户端接收到消息时要将收到的消息进行分类对应到哪个用户之中。那么我们在服务端和客户端都要建立相应的线程和用户的映射关系表。然后服务端和用户端的映射表存在着不同。用户端不需要自己的映射关系。
规则制定
我在所有的消息之前加上标识符表明该消息类型。如登陆@LOGIN 注册@REGISTER 消息@MESSAGE……也可根据自己的习惯来创建规则。
编写代码
数据库
只有一个用户表,用户名,密码,昵称和头像信息。
create table user (
account_ varchar(20) not null,
password varchar(20) not null,
nickname varchar(20) not null,
icon varchar(100),
primary key(account_)
);
服务端
对有服务端来说我们要先想好有哪些数据结构,第一个是存储所有用户的线程的,第二个在服务端用于显示在线的用户。自然我们会想到使用哈希表这个结构,速度快而且方便操作。而在这里为了支持并发操作和多线程操作,特此使用ConcurrentHashMap(支持并发操作)。然后在Swing里使用的是Jlist为了可以动态刷新好友列表我使用了DefaultListModel来实现。基于此所有的数据结构建立完毕。
客户端
一个是好友的列表由头像和名字构成,然后是对话框与账户的哈希表结构。
细节
里面传输一些对象是用到的Json,然后因为构建的哈希表key值为对象所以重写了equals函数,同时swing中用到了主题和Render才构成了最终的效果。