1.引言
1.1 目的
本报告是基于windows的关于记录完成一个局域网聊天工具的报告。
1.2 背景
在互联网+和HTML5时代,随着现代电子产品的发展,人与人之间的交流已经不存在距离和时间上的问题,聊天工具如微信,QQ等已经成为人生活上不可分割的一部分。微信等已经不仅仅最基本的聊天需求,移动支付等功能也是大大方便了人们的需求。
2.需求分析
2.1 序言
制作一个简易的局域网聊天工具,拥有用户注册和管理,好友的添加,在线好友的显示,与在线好友进行聊天的功能,该系统将基于windows平台进行开发。
2.2 项目简介
2.3系统功能
局域网聊天工具的主要功能:1、拥有数据库管理用户的账号密码;2、设计登录界面,用于管理不同的用户登录;3、设计好友列表界面,用户可以直观的检测自己的好友是否在线;4、设计聊天界面,用户可以在此界面与好友进行交流
2.3.1.登录功能
用户输入自己的账号密码进行登录,系统自动和数据库的账号密码进行比对,对不同的用户进行分别管理
2.3.2.好友功能
用户可以在此界面直观的查看自己的好友列表,已经好友是否在线。对于已经上线的好友可以进行聊天。
2.3.3.聊天功能
用户可以在此界面和好友进行信息的发送,好友如果在线可以实时看到接受的信息。
2.4.模块划分
2.4.1.登录模块
用户输入账号密码进行登录操作
2.4.2.好友列表模块
用户可以观测自己的好友列表以及好友的在线情况
2.4.3.聊天模块
界面上方显示当前好友名称,上部分的文本显示框显示用户与好友的聊天信息,下方文本框则为用户准备发出的信息。正下方为发送按钮,将用户预定发出的信息传输给用户好友
2.4.4.服务器模块
局域网架设服务器,将用户与用户的客户端进行连接,以起到聊天的功能实现。
2.5.模块图
图1 局域网聊天工具模块图
2.6流程图
图2局域网聊天工具流程图
2.7.性能要求
作为局域网的聊天系统,应做到消息实时传递成功,内存占用量低,对服务器模块的网络占用低。
3.系统设计
3.1总体设计
图3局域网聊天工具系统设计图
3.2功能设计
表1 局域网聊天工具(客户端)功能设计表
主要功能/作用 | 类/函数 | 继承的类 |
登录界面设计 | RegistFrom.cs | |
用户好友界面设计 | LittleQQ.cs | |
聊天界面设计 | ChatForm.cs | |
抽象类 | AbstractCommand.cs | |
检测好友上线 | FriendOnLine.cs | AbstractCommand.cs |
检测好友下线 | FriendOFFLine.cs | AbstractCommand.cs |
检测好友在线状态 | FriendOnLinedata.cs | AbstractCommand.cs |
用户好友数据 | Friendsdata.cs | AbstractCommand.cs |
登陆失败 | RegistKeyFalse.cs | AbstractCommand.cs |
登录成功 | RegistKeyTrue.cs | AbstractCommand.cs |
重复登录时 | Userexist.cs | AbstractCommand.cs |
用户名初始化 | UserName.cs | AbstractCommand.cs |
聊天界面发送信息 | RegistCommand.cs SendMassageCommand.cs | AbstractCommand.cs |
命令工厂,用于调用各个功能 | CommandFcatory.cs | |
底层文件,客户端的架构 | SocketOperate.cs |
图4局域网聊天工具(客户端)关系调用图
主要功能/作用 | 类/函数 | 继承的类 |
服务器管理界面及视窗 | Q1.cs | |
用户管理 | User.cs | |
用户上下线事件处理 | MyDictionary.cs | |
抽象类 | AbstractCommand.cs | |
前端发送数据 | ForwardRequest.cs | AbstractCommand.cs |
检测好友在线状态 | FriendsdataOK.cs | AbstractCommand.cs |
获取好友名字 | GetName.cs | AbstractCommand.cs |
登录日志管理 | RegistRequest.cs | AbstractCommand.cs |
详细好友数据管理 | AccessControl.cs | AbstractCommand.cs |
命令工厂,用于调用各个功能 | CommandFcatory.cs | |
底层文件,客户端的架构 | SocketOperate.cs |
表2 局域网聊天工具(服务器)功能设计表
图5 局域网聊天工具(服务器)关系调用图
4.系统开发
4.1源程序清单
4.1.1 登录模块(客户端)
名称 | 作用 |
RegistFrom.cs | 登录窗口 |
RegistButton_Click() | 登录按钮功能 |
ShowMessage() | 消息框提示 |
GetRegistfrom() | 获取单例模式的唯一实例 |
RegistKeyFalse.cs | 登录失败(成功) |
Userexist.cs | 用户重复登陆提示 |
UserName.cs | 获取用户名称 |
表3登录模块源程序表
4.1.2 好友列表模块(客户端)
名称 | 作用 |
LittleQQ.cs | 好友列表窗口 |
ADDFriends() | 添加好友 |
SetFriendOnLine() | 设置好友上线 |
SetFriendOFFLine() | 设置好友下线 |
chanceUserName() | 修改用户ID |
ChatFormShow() | 显示聊天框 |
GetChatFrom() | 获取单例模式的唯一实例 |
GetParentDirectory() | 获取上级文件目录 |
FriendOFFLine.cs | 检测好友上线 |
FriendOnLine.cs | 检测好友下线 |
FriendOnLinedata.cs | 检测好友在线状态 |
Friendsdata.cs | 用户好友数据 |
表4 聊天模块源程序表
4.1.3 聊天模块(客户端)
名称 | 作用 |
ChatForm.cs | 聊天窗口 |
MessageADD() | 将输入的信息添加到聊天框中 |
chanceIP() | 更改IP |
SendButton_Click() | 发送信息按钮 |
ChatForm_FormClosing() | 关闭聊天框 |
RegistCommand.cs | 发送信息 |
SendMassageCommand.cs | 发送信息 |
表5 登录模块源程序表
4.1.4 服务器模块
名称 | 作用 |
Q1.cs | 服务器控制界面窗口 |
Form1_Load() | 将输入的信息添加到聊天框中 |
StarButton_Click() | 服务器启动按钮 |
CheckAlive() | 定时执行ClientAlive |
ClientAlive() | 查询每一个连接是否仍存在 |
UpdataShow() | 更新内容显示 |
AddUserSignLog() | 添加用户登录日志 |
GetQ1() | |
User.cs | |
GetUserList() | 用户管理 |
AbstractCommand.cs | |
ForwardRequest.cs | 获取前端套接字 |
FriendsdataOK.cs | 发送好友在线情况 |
GetName.cs | 获取好友姓名 |
RegistRequest.cs | 详细命令集 |
AccessControl.cs | |
getWhoOwnFrien() | 获取谁拥有这个好友 |
getFriendsData() | 获取好友的详细数据 |
getFriends() | 获取好友列表 |
getFriendID() | 获取好友ID |
keyInspect() | 获取ID下的Key |
GetIP() | 获取ID下的IP地址 |
UpdateIP() | 更新用户ip地址 |
AddUser() | 往数据库中添加新用户 |
GetUserName() | 获取用户ID下的Name |
GetParentDirectory() | 获取上级文件目录 |
CommandFcatory.cs | 策略工厂 |
SocketOperate.cs | 底层基本架构 |
Star() | 启动侦听 |
Accept() | 侦听到的套接字处理 |
ReceiveMsg() | 接受数据 |
Getsocket() | 返回客户端套接字 |
表6 服务器模块源程序表
4.1.5 聊天气泡模块
名称 | 作用 |
ChatBox.cs | 聊天显示窗口 |
addChatBubble() | 添加一个文字聊天气泡 |
addImgBubble() | 添加一个图片聊天气泡 |
addVoiceBubble() | 添加一个语音聊天气泡 |
ChatBox_profileRightClicked() | |
ChatBox_Load() | 窗口显示加载 |
chatPanel_Paint() | 窗口绘制 |
CSetLineSpace.cs | 气泡内文字行间距 |
IChatBubble.cs | 文字气泡初始化 |
IImgBubble.cs | 图片气泡初始化 |
IVoiceBubble.cs | 声音气泡初始化 |
LeftChatBubble | 显示在聊天框左半边的文字气泡 |
setText() | 文字设置 |
pictureBox_profile_MouseClick() | 鼠标点击事件(显示发送人的ID) |
LeftImgBubble | 显示在聊天框左半边的图片气泡 |
setImg() | 图片设置 |
pictureBox_profile_MouseClick() | 鼠标点击事件(显示发送人的ID) |
LeftVoiceBubble | 显示在聊天框左半边的声音气泡 |
setRecord | 音频设置 |
pictureBox_img_Click | 播放音频 |
pictureBox_profile_MouseClick | 鼠标点击事件(显示发送人的ID |
RightChatBubble | 显示在聊天框右半边的文字气泡 |
setText() | 文字设置 |
pictureBox_profile_MouseClick() | 鼠标点击事件(显示发送人的ID) |
RightImgBubble | 显示在聊天框右半边的图片气泡 |
setImg() | 图片设置 |
pictureBox_profile_MouseClick() | 鼠标点击事件(显示发送人的ID) |
RightVoiceBubble | 显示在聊天框右半边的声音气泡 |
setRecord | 音频设置 |
pictureBox_img_Click | 播放音频 |
pictureBox_profile_MouseClick | 鼠标点击事件(显示发送人的ID |
表7 聊天气泡模块源程序表
4.2功能实现
4.2.1 UI布局设计
登陆界面设计,如图4所示。
图6登陆界面设计图
好友列表设计,如图5所示。
图7 UI好友列表设计图
聊天窗口设计,如图6所示。
图8 UI聊天窗口设计图
服务器窗口设计,如图7所示。
图9 UI服务器窗口设计图
聊天窗口气泡设计(以下图片基于单独测试),如图8,9所示。
图10 UI聊天窗口气泡设计图
图11 UI聊天窗口气泡设计图
4.2.2 消息发送
文件名 | 内容 |
RegistCommand.cs | namespace Client.SendCommand { //登录命令数据报为:registRequest/IPEndPoint(用户自身端口)/用户ID/用户密码 class RegistCommand : AbstractCommand { //重载父类方法(实现登录功能) public override void Operate(string Txt) { //发送数据 try { //给文本附加命令 Txt = "registRequest/" + SocketOperate.GetSocket().GetLocalEndPoint() + "/" + Txt; //发送消息 SocketOperate.GetSocket().SendMessage(Txt); } catch { RegistFrom.GetRegistfrom().ShowMessage("服务器未响应"); RegistFrom.GetRegistfrom().ButtonOF(true); } } } } |
SendMassageCommand.cs | namespace Client.SendCommand { class SendMassageCommand : AbstractCommand { //转发命令数据报为:forwardRequest/目标端口/文本 public override void Operate(string Txt) { SocketOperate socket = new SocketOperate(); Txt = "forwardRequest/" + Txt; socket.SendMessage(Txt); } } } |
表8 消息发送程序表
4.2.3 聊天气泡生成
文件名 | 内容 |
Chatbox.cs | public void addChatBubble(BubbleSide bubbleSide,string msg,string sender,string senderID,string profileImgPath)//生成文字气泡 { IChatBubble bubble = null; if(bubbleSide == BubbleSide.LEFT) { bubble = new LeftChatBubble(); (bubble as LeftChatBubble).profileRightClicked += ChatBox_profileRightClicked; } else if(bubbleSide == BubbleSide.RIGHT) { bubble = new RightChatBubble(); (bubble as RightChatBubble).profileRightClicked += ChatBox_profileRightClicked; } if (chatPanel.Controls.Count != 0) (bubble as Control).Top = chatPanel.Controls[chatPanel.Controls.Count - 1].Top + chatPanel.Controls[chatPanel.Controls.Count - 1].Height; chatPanel.Controls.Add(bubble as Control); bubble.setText(msg, sender,senderID,profileImgPath); chatPanel.ScrollControlIntoView(bubble as Control); } public void addImgBubble(BubbleSide bubbleSide,string imgPath, string sender, string senderID, string profileImgPath)//生成图片气泡 { IImgBubble imgBubble = null; if (bubbleSide == BubbleSide.LEFT) { imgBubble = new LeftImgBubble(); (imgBubble as LeftImgBubble).profileRightClicked += ChatBox_profileRightClicked; } else if (bubbleSide == BubbleSide.RIGHT) { imgBubble = new RightImgBubble(); (imgBubble as RightImgBubble).profileRightClicked += ChatBox_profileRightClicked; } if (chatPanel.Controls.Count != 0) (imgBubble as Control).Top = chatPanel.Controls[chatPanel.Controls.Count - 1].Top + chatPanel.Controls[chatPanel.Controls.Count - 1].Height; chatPanel.Controls.Add(imgBubble as Control); imgBubble.setImg(imgPath, sender, senderID, profileImgPath); chatPanel.ScrollControlIntoView(imgBubble as Control); } public void addVoiceBubble(BubbleSide bubbleSide, string recordPath, string sender, string senderID, string profileImgPath)//生成声音气泡 { IVoiceBubble voiceBubble = null; if (bubbleSide == BubbleSide.LEFT) { voiceBubble = new LeftVoiceBubble(); (voiceBubble as LeftVoiceBubble).profileRightClicked += ChatBox_profileRightClicked; } else if (bubbleSide == BubbleSide.RIGHT) { voiceBubble = new RightVoiceBubble(); (voiceBubble as RightVoiceBubble).profileRightClicked += ChatBox_profileRightClicked; } if (chatPanel.Controls.Count != 0) (voiceBubble as Control).Top = chatPanel.Controls[chatPanel.Controls.Count - 1].Top + chatPanel.Controls[chatPanel.Controls.Count - 1].Height; chatPanel.Controls.Add(voiceBubble as Control); voiceBubble.setRecord(recordPath, sender, senderID, profileImgPath); chatPanel.ScrollControlIntoView(voiceBubble as Control); } |
表8 聊天气泡生成程序表
5.2测试实现
| ||||||||||||||||||||||||||||||||||||||||||||||||||
编号 | 权限(并列关系) | 测试项 | 测试类别 | 描述/输入/操作 | 期望结果 | 真实结果 | 备注 | |||||||||||||||||||||||||||||||||||||||||||
00001 | 无 | 登录界面 | 账号输入框 | 功能测试 | 输入账号 | 可输入数字 | 能 | |||||||||||||||||||||||||||||||||||||||||||
00002 | 密码输入框 | 输入密码 | 输入数字后数字显示为星号 | 能 | ||||||||||||||||||||||||||||||||||||||||||||||
00003 | 登录按钮 | 登录按钮是否可用 | 可用 | 能 | ||||||||||||||||||||||||||||||||||||||||||||||
是否可以进入好友列表 | 可以进入好友列表 | 能 | ||||||||||||||||||||||||||||||||||||||||||||||||
00004 | 无 | 好友列表 | 用户名称显示 | 功能测试 | 显示登录用户的名称 | 正常显示登录用户的名称 | 能 | |||||||||||||||||||||||||||||||||||||||||||
00005 | 好友列表显示 | 显示用户数据库中的好友列表 | 正常显示用户数据库中的好友列表 | 能 | ||||||||||||||||||||||||||||||||||||||||||||||
00006 | 好友名称显示 | 显示好友的名称 | 正常显示好友的名称 | 能 | ||||||||||||||||||||||||||||||||||||||||||||||
双击好友名称 | 进入好友聊天框 | 能 | ||||||||||||||||||||||||||||||||||||||||||||||||
00007 | 无 | 聊天界面 | 好友名称显示 | 功能测试 | 显示好友的名称 | 正常显示好友的名称 | 能 | |||||||||||||||||||||||||||||||||||||||||||
00008 | 聊天输入框 | 输入聊天信息 | 可输入聊天信息 | 能 | ||||||||||||||||||||||||||||||||||||||||||||||
00009 | 聊天信息框 | 显示接收到的聊天信息 | 可正常显示接收到的聊天信息 | 能 | ||||||||||||||||||||||||||||||||||||||||||||||
00010 | 发送按钮 | 发送按钮是否可用 | 可用 | 能 | ||||||||||||||||||||||||||||||||||||||||||||||
发送聊天输入框中聊天信息 | 成功发送 | 能 |
表9 聊天模块测试表
| ||||||||||||||||||||||||||||||||||||||||||||||||||
编号 | 权限(并列关系) | 测试项 | 测试类别 | 描述/输入/操作 | 期望结果 | 真实结果 | 备注 | |||||||||||||||||||||||||||||||||||||||||||
00001 | 无 | 服务器调试界面 | 服务器IP地址输入框 | 功能测试 | 输入IP地址 | 可输入数字 | 能 | |||||||||||||||||||||||||||||||||||||||||||
设置服务器IP | 成功设置服务器IP | 能 | ||||||||||||||||||||||||||||||||||||||||||||||||
00002 | 服务器端口地址输入框 | 输入端口地址 | 可输入数字 | 能 | ||||||||||||||||||||||||||||||||||||||||||||||
设置服务器启动端口 | 成功设置服务器启动端口 | 能 | ||||||||||||||||||||||||||||||||||||||||||||||||
00003 | 在线用户监测窗口 | 监测成功登录的用户和IP地址 | 显示登录用户和用户登录的IP地址 | 能 | ||||||||||||||||||||||||||||||||||||||||||||||
00004 | 用户登录日志窗口 | 监测用户上下线的行为 | 根据用户行为进行记录 | 能 | ||||||||||||||||||||||||||||||||||||||||||||||
00005 | 客户端操作日志窗口 | 监测客户端进行的变动 | 根据客户端变化进行记录 | 能 | ||||||||||||||||||||||||||||||||||||||||||||||
00006 | 文字发送框 | 输入文字 | 输入文字 | 能 |
表10 服务器模块测试表
| ||||||||||||||||||||||||||||||||||||||||||||||||||
编号 | 权限(并列关系) | 测试项 | 测试类别 | 描述/输入/操作 | 期望结果 | 真实结果 | 备注 | |||||||||||||||||||||||||||||||||||||||||||
00001 | 无 | 聊天界面 | 文字气泡 | 功能测试 | 输出文字后以文字气泡形式显示 | 正常显示 | 能 | |||||||||||||||||||||||||||||||||||||||||||
00002 | 图片气泡 | 输出图片后以文字气泡形式显示 | 正常显示 | 能 | ||||||||||||||||||||||||||||||||||||||||||||||
00003 | 语音气泡 | 能否正常发送语音气泡 | 可用 | 能 |
表11 聊天气泡模块测试表