一、软件简介
本软件主要完成简单的多客户端实时通信,基于TCP协议的局域网聊天软件。首先启动服务器,服务器启动后等待客户端的请求,同时显示出离线用户列表。客户端通过输入账号和密码进行登录,如果登录成功,则进入聊天界面,同时显示当前在线好友列表和离线好友列表,如果登录失败,则提示用户账号或者密码错误。当多个客户端进入聊天室后,客户之间可以进行群聊,用户同时可以选择与当前在线的某一好友进行私聊。
二、需求分析
2.1、任务概述
随着信息化时代的快速发展,互联网的应用越来越广泛,同时实时聊天通信技术变得日益重要,不论在学校、家庭或者是公司,局域网聊天已经离不开我们的日常生活。本软件所设计的局域网聊天系统能够实现局域网的聊天、群聊、私聊等功能。
2.2、需求规定
该软件可以完成多客户端的通信,服务器端包括:服务器启动,离线用户列表和在线用户列表,同时还要完成客户端登录信息的验证,当有用户登录成功时,服务器端实时刷新在先用户列表。客户端包括:用户登录,当用户登录成功后,进入聊天界面,用户之间可以进行群聊和私聊。
2.3、对性能的规定
2.3.1、时间特性要求
所有发送操作的响应的时间一般不超过1秒,大量的信息发送后,应该在5秒内显示,如果未发送失败,会提示出相关的错误信息。当存在离线用户上线时,用户在线列表更新时间在3秒内响应。
2.3.2、运行环境规定
该软件只能在windows环境平台下运行,内存在256M以上,硬盘1G空余空间。
三、总体设计
3.1、软件总体功能结构图
图(3.1) 软件总体功能结构图
如图(3.1)所示为该软件总体功能结构图,其中主要包括两大部分:服务器端和客户端。其中服务器端主要包括:连接数据库、用户列表更新、客户端信息处理。客户端包括:客户端登录、在线用户列表、离线用户列表、用户群聊、用户私聊。
3.2、软件工作流程图
图(3.2) 软件工作流程图
如图(3.2)所示,为整个软件工作的流程图,首先开启服务器,服务器等待客户端的请求连接,然后客户端发送连接请求(发送账号和密码),然后等待服务器的回应,服务器收到连接请求后,验证客户信息,如果信息验证成功,则连接建立成功,好友之间通过服务器端向客户端发送好友信息。
3.3、服务器总体设计
服务器端主要功能:
(1)数据库设计:设计数据库,用户存储客户信息,例如用户的账号、密码、昵称等。
(2)客户端请求信息处理:主要用来处理用户登录验证,如果验证成功,则给客户端回复登录成功信息。
(3)客户端信息转发:主要完成客户之间通信时,首先客户发送信息给服务器,服务器端然后在转发给其他的客户。
(4)用户列表更新:主要用来处理当有新客户端登录成功后,对现在用户列表和离线用户列表进行更新。
3.4、客户端总体设计
客户端主要功能:
(1)客户端登录:主要完成客户端的登录,客户端输入用户名和密码,然后进行登录,如果登录成功,则跳转到聊天模块,如果登录失败,则提醒用户名或者密码错误。
(2)连接服务器:通过当前输入的账号和密码,连接服务器开启的端口号。
(3)实时通信模块:主要完成在线用户之间进行群聊和私聊。
(4)用户列表更新:主要显示当前在线好友列表和离线好友列表。
四、详细设计
4.1、软件详细的功能流程图
图(4.1)软件详细功能流程图
4.2、数据库设计
该系统采用的是微软的Access数据库,用来存放用户信息,数据字典如下表所示:
表(一)用户信息
本系统将数据库操作封装为一个类,方便开发人员的操作,相关的函数介绍如下所示:
打开数据库函数:void OpenDataBase();
关闭数据库函数:void CloseDataBase();
打开记录集:_RecordsetPtr& OpenRecordset(CString sql);
关闭记录集:void CloseRecordset();
4.3、程序中定义的核心数据结构
1、定义消息头的数据结构
typedef struct tagHeader
{
char type;
int len;
} Header, *pHeader;
以上结构体主要包含两个部分内容,type为char型字符,用来存储用户发送的是什么类型的消息,type定义的取值如下所示:
#define LOGIN_IO 1 //用户登录消息
#define SEND_MESSAGE 3 //用户发送消息
#define PRIVATE_MESSAGE 4 //用户私聊消息
#define PASS_SUCCESS 5 //用户密码验证成功消息
#define PASS_FAILED 6 //用户密码验证失败消息
#define SERVER_STOP 7 //服务器停止消息
#define ASK_NUM 8 //应答消息
#define ASKNUM_FAILED 9 //应答失败消息
#define PRIVATE_ASK 10 //私聊应答消息
#define PRIVATE_REFUSE 11 //私聊拒绝消息
以上为该软件定义的头消息结构的类型,主要包括:用户登录消息、用户发送消息、用户私聊消息、用户密码验证成功消息、用户密码验证失败消息、服务器停止消息、应答消息、应答失败消息、私聊应答消息、私聊拒绝消息。用户通过发送不同的消息类型给服务器,服务器收到消息类型后进行判断,依据不同的消息类型进行不同的处理。
2、定义用户登录信息数据结构
typedef struct LogonUser
{
CString name;
CString password;
} User, *pUser;
以上结构体主要包含两部分:用户名和密码。当用户登录时,客户端将用户发送给服务器端,服务器端接收到后,对用户名和密码进行验证。
4.4、客户端详细设计
1、用户登录模块
(1)用户登录模块流程图
图(4.2) 用户登录模块流程图
(2)程序描述
对在用户登录信息界面中输入的各项信息进行初步检验。若发现错误,提示用户输入错误,让用户重新输入一次。若未发现错误,转入主界面。其中的错误种类有:输入数据不匹配、账号(数据库没有该账号)、密码(与对应账号的密码不匹配)。在登录界面中,主要的函数为:
判断是否为空:IdentifyNull(name,password,server);
创建套接字:CreateSocket(server);
发送账号:SendName(name);
发送密码:SendPssword(password);
其中发送账号和密码的函数为:
//发送用户名
void CDlgLogin::SendName(CString name)
{
//设置发送类型
head.type = LOGIN_IO;
//发送长度
head.len = name.GetLength();
//发送登陆LOGIN_IO命令字
m_pSocket->Send((char *)&head,sizeof(Header));
//发送账号
m_pSocket->Send(name,name.GetLength());
}
//发送密码
void CDlgLogin::SendPssword(CString password)
{
head.type = PASS_SUCCESS;
head.len = password.GetLength();
//发送验证密码PASS_SUCCESS命令字
m_pSocket->Send((char *)&head,sizeof(Header));
m_pSocket->Send(password,password.GetLength());
}
2、群聊模块
(1)群聊模块流程图
图(4.3) 群聊模块流程图
(2)程序描述
群聊主要完成多客户端之间的通信,主要的函数及其功能如下:
更新用户列表:UpdateUser()
接收消息:GetSendMessage()
发送消息:OnButtonSend()
其中发送消息的详细程序代码如下:
void CChatClientDlg::OnButtonSend()
{
// TODO: Add your control notification handler code here
//得到发送的消息内容
CString messaegeContent;
m_sendMessage.GetWindowText(messaegeContent);
//判断发送的消息是否为空消息
if(messaegeContent == "")
{
AfxMessageBox("不能发送空消息!");
//设置鼠标的焦点
CEdit *pEdit = (CEdit*)GetDlgItem(IDC_EDIT_SENDINFO);
pEdit->SetFocus();
return;
}
//发送消息的结构体
Header head;
//发送消息的命令字
head.type = SEND_MESSAGE;
//发送消息的长度
head.len = messaegeContent.GetLength();
//当前时间
CTime time = CTime::GetCurrentTime();
//时间格式
CString t = time.Format("%H:%M:%S");
//昵称
CString nikeName = theApp.m_strName;
CString str = nikeName + " " + t + "\r\n" + " " +messaegeContent;
//发送命令字
m_pSocket->Send((char *)&head,sizeof(Header));
//发送消息
if(m_pSocket->Send((LPCTSTR)str, str.GetLength()))
{
//清空消息框
m_sendMessage.SetWindowText("");
CEdit *pEdit = (CEdit*)GetDlgItem(IDC_EDIT_CHATINFO);
pEdit->SetFocus();
}
else
{
AfxMessageBox("网络传输错误!");
}
}
3、私聊模块
(1)私聊模块流程图
图(4.4) 私聊模块流程图
(2)程序描述
私聊模块主要实现点对点之间的通信,相关的函数如下所示:
发送消息:OnButtonSend()
获取消息:GetMessage(CString strPrivtMsg)
其中发送消息的详细代码如下所示:
void CPrivateDlg::OnButtonSend()
{
// TODO: Add your control notification handler code here
CString sendMsg;
m_sendMessage.GetWindowText(sendMsg);
if(sendMsg == "")
{
AfxMessageBox("不能发送空消息!");
CEdit *pEdit = (CEdit*)GetDlgItem(IDC_EDIT_SEND);
pEdit->SetFocus();
return;
}
Header head;
if(theApp.PrivateOrLeave)
{
head.type = LEAVE_MESSAGE;
head.len = sendMsg.GetLength();
CTime time = CTime::GetCurrentTime();
CString t = time.Format("%H:%M:%S");
CString str1 = theApp.m_strName + " " + t + "\r\n" + " " +sendMsg+"\r\n";
CString str =theApp.m_strLeaveDesName+'&'+ theApp.m_strName +'&'+theApp.m_strName+t+"\r\n" + " " +sendMsg+"\r\n"+'&';
//目的主机名+本地主机名+时间+回车换行+消息
m_pSocket->Send((char *)&head,sizeof(Header));
//发送离线消息命令字 LEAVE_MESSAGE,发送用户名+时间+消息内容
if(m_pSocket->Send((LPCTSTR)str, str.GetLength()))
{
//清空发送文本框
m_sendMessage.SetWindowText("");
//在接收文本框 显示出来
m_receiveMessage.ReplaceSel(str1);
//在控件显示消息
UpdateData(FALSE);
CEdit *pEdit = (CEdit*)GetDlgItem(IDC_EDIT_SEND);
pEdit->SetFocus();
}
else
{
AfxMessageBox("网络传输错误!");
}
}
…….
}
4.5、服务器端详细设计
1、启动服务器,等待客户连接
//创建socket对象
CServerSocket *m_pSocket;
m_pSocket = new CServerSocket;
if(!m_pSocket->Create(9999))
{
AfxMessageBox("创建Socket失败!");
return FALSE;
}
if(!m_pSocket->Listen())
{
AfxMessageBox("创建侦听发生错误!");
return FALSE;
}
2、用户列表更新
(1)用户列表更新流程图
图(4.5) 用户列表更新流程图
(2)程序描述
在线用户列表和离线用户列表实时更新:
UpdateUser(CServerClientSocket *pSocket,CString m_usrLeaveName,int type)
离线用户列表显示:ListCloseUser()
3、其他函数介绍
验证用户信息:IdentifyUser(CString name, CString password)
通过账号得到用户名:GetNameByNum(CString num)
通过账号得到密码:GetPassByNun(CString num)
五、实现和运行结果
1、服务器端
图(5.1) 服务器监听 图(5.2)客户登录成功,服务器显示信息
2、客户端
图(5.3)客户端登录界面
图(5.4)群聊模块
图(5.5)私聊请求模块
图(5.6)私聊模块
第二篇:印象笔记和有道云笔记功能分析报告v1.0
印象笔记和有道云笔记功能分析报告
一、 功能差异:(分析规则:功能差异+需求分析)
1. 新建笔记格式
印象笔记PC端可新建文字笔记、手写笔记、语音笔记(需要录音硬件)和照片笔记(需要摄像头或者其他摄像外设),至于其他的音频、图像、视频文件可以用附件添加到笔记中。
有道云笔记的PC客户端只能新建文字笔记,其他的文件都只能通过附件添加。这与有道笔记定位有关,有道笔记定位于随手速记身边事物,有道笔记的PC客户端是主要让用户看笔记用的,而不是新建笔记,所以不需要其他笔记功能。
2. 笔记查看
印象笔记可在笔记页面中双击笔记列表面板中的笔记信息的可在新窗口查看笔记,下图是单独一个笔记的查看窗口,与主题的客户端在处理笔记功能上完全没有差异,只是笔记展示的方式不一样,目的就是为了减少干扰,把一份笔记单独拿出来处理。(可以最大化也可以小窗。)
反观有道云笔记,不能在新窗口中打开笔记,而是在已有窗口中隐藏左侧面板和笔记列表面板,把笔记显示窗口最大化,如下图,可是这个功能很少用,因为有道笔记是给用户随手记笔记的工具,这种随手笔记就不会太长,在侧边栏浏览就能把笔记看完的长度。虽然设计是这样,但是我对于这种显示方式持保留意见,因为在看笔记的同时,侧边栏还有很多元素分散我的注意力,阅读体验不好。
3. 分享
印象笔记暂时只可以通过邮件发送笔记正文,不能通过社交网站分享。
有道笔记可以分享到网易微博、新浪微博,也可以邮件分享、链接分享、分享给有道笔记用户。
相比之下,有道笔记的分享属性更加强,印象笔记更加私密。
4. 笔记容量
印象笔记不限笔记容量,而是限制流量,免费用户限制每个月60M的流量,通过付费升级可以增加至1G/月的流量。
有道云笔记初始容量1G,随着登陆在线时间的增加0.1Kb/秒的容量上限,3GB封顶,但官方声称“未来会不定期增加可以获得的空间上限。”。从这方面来说有道笔记这明显不够用啊,半年就会用完的容量还能继续留住用户吗,可能在半年内会有容量升级吧,不然迫使用户删除笔记,这样的体验用户可不会接受,可是一下子向服务器硬件投入大量经费在此阶段也是不可取,如何平衡硬件设施和用户要求呢,要看有道云笔记的规划。
5. 检索分类
印象笔记在最顶层的笔记本目录下细分出各笔记本组,笔记本组下包含各笔记本,笔记本再下一级是一篇一篇的笔记,通过这样的一层层分级可以便利地找到所需笔记,还有标签功能,这已经是邮箱时代的产物了,随着时间的推移证明了这个功能在于互联网时代的信息管理是必备品。此外,笔记来源、笔记的特殊形态、创建时间、修改时间这些属性都可以用于笔记的检索,对于数量不是很庞大的知识管理来说非常方便。当笔记的数量变得很大,还是搜索功能才能掌控住。
相对比起来有道云笔记的PC客户端略显简陋,除了笔记本组、按时间检索和搜索以外,其他检索功能都没有,不明白为什么会这样。
个人觉得有道的除了没有标签有点可惜,其他的够用了,印象笔记的太冗杂了。
6. 第三方功能
印象笔记开放API已经有一段时间了,而且EVERNOTE
公司内部自己也在此开
发了一些拓展应用,例如:印象笔记圈点、印象笔记剪辑、印象笔记人脉、印象笔记食记、印象笔记悦读。在此就不一一分析了,这些应用主要分为两种:1.要么帮助用户更好更快地获得有价值的知识,2.要么帮助用户更好地管理知识系统,都是围绕印象笔记这一核心应用展开的附加功能。
而有道云笔记是有道德工具类应用的一个,同等级别的应用还有有道词典、网
易八方等,关键是怎么打通这些应用,使之更好地连接起来。
7. 导入导出功能差异
印象笔记可导入enex(evernote自家的笔记文件格式)或者Microsoft OneNte
格式的笔记,导出可以导出到网页文件或者evex文件。
印象笔记导入导出都可以选择enex文件和ynote文件(有道云笔记自家笔记
格式),还可以从网页上导入印象笔记的内容。这有好处:从印象笔记转过来的转换成本低。
8. 同步
9. 印象笔记每隔几分钟自动同步一次,以防笔记丢失,而且在还没有同步完成之前就
关闭印象笔记的话,会强制弹出同步进度条,一定要同步完成才能关闭。
10. 有道云笔记是国内首先推出手动同步的云笔记工具,但是如果不手动同步的话,笔
记就只能一直呆在本地文件夹中,在同步完成之前关闭有道云笔记的话,同步中断,在下次打开的时候再继续未完成的同步。
二、 个人看法
1. 印象笔记更像是生产力工具,用于整理日益庞大的个人知识系统,作为人的“第二
大脑”的作用,所以在收集知识、查看知识方面的功能都做得很全面。
既然是作为“第二大脑”,记录的信息一定不止一个类型,满足的用户不止一个群体,而是满足所有人记录信息的需求,而不同的信息对应的适合收集方式又不完全一样,所以印象笔记开放了API,让第三方开发者一同开发不同功能的应用,像已有的印象笔记人脉、圈点、悦读等应用,分别对应的是不同类型的知识体系,需要不同类型的收集途径,印象笔记在向着理想愿景一点点前进。
2. 有道云笔记相比起来更像是随身的笔记本,记录生活上各种细小琐碎的事情以防自
己忘记掉,同步到云端以后再用PC查看,所以移动端客户端的主要功能在于记录笔记,提供的笔记形态也多种多样,而PC端作为一个查看的端口,相对来说写笔记的功能没有那么重要。
三、 目前可参考资料:
印象笔记进中国
易方云笔记
云笔记对比分析
Evernote的中国门徒
Phil Libin的六步计划让Evernote从应用变成平台
透过数据看Evernote:3400万用户,140万付费用户
有道云笔记宣布用户量突破300万计划开放API