QQ聊天室系统设计
概要
这是对于这学期的大作业的设计的总结与归纳,并在假期后对该练习项目进行重新构建以及功能添加,以下是对大作业原本的设计思路与过程进行记录。(需改进:(1)界面美化,分组功能应加强,(2)添加聊天记录文件并将路径和存入数据库在读出,(3)可以考虑将文件发送到云端实现云文件功能,(4)查找好友另起页面并获取列表,(5)将未登录的好友显示为黑白头像,不再不显示。(6)尝试学习ffmpeg制作视频功能。(7)将手动相对路径改为将绝对路径改为相对路径,由此可以避免之前的仅一个文件夹的图片可用。(8)好友删除(9)背景音乐修改)
一、网络消息设计
使用Java的Sockt并用其构建一套信息的判断及传输的机制,用于用户之间的互传。
1、首先介绍Socket的基础使用方式。
套接字需要相互连接方可使用,其Socket连接模型图如下:
我们使用一个HashMap来存储我们的服务器与客户端的每一个套接字链接(对于每一次服务器与客户端之间的链接,我们均进行一次判断,当且仅当,登录成功后,服务器会将链接好的套接字放入hashMap中,并使用服务器转发的方式对需要发送的其他用户的信息进行处理)。这样每个客户端仅仅需要与服务器进行信息交互,套接字无需与其他用户的套接字进行连接,这样可以避免套接字连接而产生的套接字争夺问题。(此处HashMap实质上是一个由链表实现的hash表,使用开放寻址法实现而成的。)
2、文件、字符串、表情包发送功能实现思路
对于文件而言,文件的数据大小过大,在传输时如果直接传输,由于TCP协议的不稳定行,极有可能产生数据丢失的情况,因此对于文件的发送,更好的方式是反复发送并通过服务器转发,但是需要注意,在接收方,我们不能使用循环来接收文件的信息。倘若使用循环在客户端接收文件信息,那么由于循环,接受方的客户端便会因为循环接收导致其他信息的接收无法接收,导致无法实现即时接收他人消息的功能,因此需要对该种消息进行特殊处理。如使用一个常量对信息进行标记,然后在接收时对信息进行分类接收处理(同时在发送时应当进行延时处理,避免发送速度过快,导致文件粘包问题。)。同时字符串以及图片信息也应当进行区分,以避免数据接收处理错误。形成聊天效果如下图
3、信息接收功能
信息的接收由于无法确定发送方究竟是何时发送信息,且为了满足需求,我们不能将其设计为“回合制“的聊天方式,因此我们应当等待对方的信息以便处理,但同时,等待会导致整个进程阻塞无法执行其他功能,因此我们需要开启一个子线程来帮助我们接收一件处理信息。
4、登录注册界面
登录与注册是获取用户的核心,唯有登录成功才能开启其他功能,因此登录与注册是十分重要的,他们负责连接服务端,开启信息传输的通道。其界面及运行效果如下。
好友界面功能
统一显示各个好友的界面,并通过在该界面中的各个相关事件对信息进行处理。如 好友头像的点击事件会进入聊天界面等,在如在其子线程下,对接收信息的各项处理。
大概功能如上所述,该联系项目有待完善。
https://download.csdn.net/download/qq_44423125/12611737
项目地址先放CSND上,等放假后放girhub上。