您的位置:首页 > 其它

局域网即时通讯软件的实现

2008-12-22 16:27 393 查看

一. 概述

1.1. 背景

局域网内的即时通讯软件,命名NetMsg。

1.2. 功能描述

定位于局域网内的即时通信软件,借鉴飞鸽传书、QQ等即时通讯工具,提供以下功能:
Ø 程序启动后自动搜索局域网内所有启动NetMsg的用户,将用户添加到用户列表,可以与这些用户进行通讯;
Ø 用户可以设定自己的昵称、在线状态等相关信息;
Ø 实现局域网内用户与用户之间一对一、一对多的实时通讯,通讯内容主要是文本数据;
Ø 实现局域网内文件或目录的可靠传输;
Ø 对通讯内容或文件进行加密和校验的功能;
Ø 对通讯内容、传输文件有日志记录,便于以后查看;
Ø 程序界面方面:具备简洁明了的主窗口,任务栏显示图标快捷方式;主窗口大小可以调节,位置可以拖动,可以停靠到屏幕上部边缘;主窗口始终显示在桌面最上层;文本通讯窗口提供文本输入区域和文本显示区域;文本通讯窗口提供用户详细信息;文本通讯窗口提供文件传输功能菜单或功能按钮等;文本通讯窗口大小可以调节、位置可以移动;

1.3. 开发平台

Microsoft Windows Xp sp2操作系统;
C,C++语言;
VisualC++6.0作为开发工具,使用到了MFC的类库;

1.4. 运行环境

Microsoft Windows2000、WindowsXp,Windows2003操作系统。

二. 设计

2.1. 原理

局域网络内登录NetMsg的用户之间是对等的关系,用户之间直接进行数据交互而不需要通过中间服务器;
登录用户列表的建立,使用UDP协议发送广播数据包,已启动NetMsg的用户收到此广播包后,就会在自己的用户列表中添加此用户,同时向对方发送本机用户相关信息,从而使双方都能建立起用户列表;
传送聊天信息使用UDP协议,由于UDP协议是无连接协议,传输速度快,但是没有确认机制,是不可靠的协议,鉴于局域网网络状况相对稳定,基本能够保证数据包的正常到达目的地,不需添加自定义确认机制;
用户离线时同样发送一个广播数据包,其它用户收到此数据包后根据包中的信息删除此用户;
文件内容的传输采用TCP协议;

2.2 数据传输协议

数据传输协议定义了发送数据包的格式,通讯双方对数据包内容含义的理解。
数据包包括数据包包头和消息体,格式如下:
版本号:数据包编号:MAC地址:登录用户名:主机名:数据包生成时间:命令字:校验和:消息体
其中消息体前面的内容是数据包包头信息的定义,各选项含义如下:
序号[/b]选项[/b]含义[/b]
1版本号程序版本号。
2数据包编号发送数据包编号。(暂时不用)
3MAC地址主机网卡的地址,唯一标识一个用户。
4登录用户名登录操作系统启动当前程序的用户名。
5主机名主机名称。
6数据包生成时间数据包生成时间。
7命令字命令字,标识本数据包的含义,确定怎样解析消息体。
8校验和消息体内容的校验和。(暂时不用)
9消息体消息体内容。
其中最重要的一个选项是命令字,根据命令字的不同含义执行相关的操作,各命令字的含义如下:
命令字含义附加信息
MSG_NOOPERATION不进行任何操作
MSG_BR_ENTRY广播通报用户上线用户信息
MSG_BR_EXIT广播通报用户下线
MSG_ANSENTRY对广播数据包的答复用户信息
MSG_SENDDATA发送消息命令字。消息内容。
MSG_UPDATE_USERINFOR更新用户信息命令字。用户信息。
MSG_FILE_SEND通知发送文件文件信息(文件长度、名称等)
MSG_FILE_AGREERECV同意接收文件
MSG_FILE_PREPARE传输文件准备就绪
MSG_FILE_ERROR传输文件失败错误代号。代号格式:4XXXX
MSG_FILE_REFUSERECV拒绝接收文件
MSG_FILE_BREAKSEND中断发送文件
MSG_FILE_BREAKRECV中断接收文件

2.3 数据结构定义

2.3.1数据包包头定义
Public class PacketHead{
CString version ; //版本号
DWORD dataId ; //数据包编号,暂时不用,只作为占为,赋值0
CString macAddr ; //MAC地址,用于唯一的标识一个用户
CString loginUserName ; //登录系统用户名
CString hostname ; //主机名称
CString time ; //数据包发送时间,格式:2008-11-9 12:10:00
UINT cmd; //命令字
CString checksum ; //校验和,暂时不用,赋值:checksum
PacketHead();
~ PacketHead();
int GetPacketHead(CString &recvBuf ,int recvDataLength); //解析接收到的数据,分离出数据包包头的各项数据
CString GetPacketHeadData(); //得到数据包包头的字符串。
};

2.3.2 用户信息类
class CUserInfor
{
public:
int GetUserFromRecvbuf(CString &recvbuf); //解析收到数据包得到用户信息
CString GetUserInforData(); // 返回用户信息字符串
private:
CString strMACAddr ;
CString strNickname ;
CString strHostName ;
CString strHostIp ;
CString strUserName ;
CString strWorkGroup ;
UINT indexImage ;
};
2.3.3 传送文件类

2.4 文件传输过程



甲方向乙方发送MSG_FILE_SEND 甲命令字请求传送文件,
A: 如果乙方同意接收文件,向甲方发送MSG_FILE_AGREERECV命令字表示同意接收,甲方接受到MSG_FILE_AGREERECV命令字后启动一个新线程建立TCP监听套接字同时向乙方MSG_FILE_PREPARE命令字表示已经准备就绪 ,乙方可以连接接收文件, 乙方接受到MSG_FILE_PREPARE命令字后发送TCP连接请求,进行文件传输。 如果任何一个环节出来错误,则向对方发送MSG_FILE_ERROR命令字,双方做各自的清理工作,比如关闭线程、关闭套接字等。
B: 如果乙方拒绝接受文件则向甲方发送MSG_FILE_REFUSERECV命令字。
C:如果在文件传输过程当中任何甲方终止传输,则需要向乙方发送MSG_FILE_BREAKSEND命令字,如果乙方终止接收则需要向甲方发送MSG_FILE_BREAKRECV套接字。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: