《p2p即时聊天系统》由会员分享,可在线阅读,更多相关《p2p即时聊天系统(26页珍藏版)》请在金锄头文库上搜索。
1、 教育资料 一 一 课程设计题目课程设计题目 基于 P2P 的局域网即时通信系统 二 二 实验环境及工具实验环境及工具 1 计算机 PC 机 PC 虚拟机 2 操作系统 Windows2000 WindowsXP 3 程序设计语言 VC 6 0 三 三 设计要求设计要求 1 实现一个图形用户界面局域网内的消息系统 2 功能 建立一个局域网内的简单的 P2P 消息系统 程序既是服务器又 是客户 服务器端口使用 3333 a 用户注册及对等方列表的获取 对等方 A 启动后 用户设置自己的 信息 用户名 所在组 扫描网段中在线的对等方 3333 端口 打开 向所有在线对等方的服务端口发送消息 接收方
2、接收到消 息后 把对等方 A 加入到自己的用户列表中 并发应答消息 对等 方 A 把回应消息的其它对等方加入用户列表 双方交换的消息格式 自己根据需要定义 至少包括用户名 IP 地址 b 发送消息和文件 用户在列表中选择用户 与用户建立 TCP 连接 发送文件或消息 3 用户界面 界面上包括对等方列表 消息显示列表 消息输入框 文 件传输进程显示及操作按钮或菜单 四 四 设计内容与步骤设计内容与步骤 1 学习 Socket 和 TCP 的基本原理和通信机制 2 功能设计和界面设计 3 服务器功能的设计和实现 4 客户功能的设计和实现 5 课程设计任务说明书 五 五 方案设计方案设计 教育资料
3、1 消息格式 本系统采用的消息格式是 文件头 消息内容 文件头为 1 9 消息格式分配如下 1 1 本机名 本机名 登陆 发送给所有在线对等方的服务端口 2 2 本机名 本机名 对登陆消息的回馈 3 3 本机名 本机名 退出 4 4 本机名 本机名 对话请求 51 51 或或 52 52 对话请求的回应 是否同意 6 6 本机名本机名 退出对话退出对话 退出对话 7 7 对话内容 对话内容 对话 8 8 文件名长度文件名长度 文件名文件名 文件长度文件长度 转换成转换成 CString CString 请求传送 91 91 同意传输 92 92 拒绝 93 93 磁盘已满 2 该软件分别开了
4、3 个监听端口 3333 3334 3335 之所以分开 3 个 端口是因为各种传送的不同 在设计实验的过程中我发现对于登陆消息 退出消息 应该用的 socket 是即用即断即用即断 即比如我收到登陆消息 并 发送回馈消息后就断开连接 这样就不用一个用户同时连接很多用户 如果用完不断 就是全连接了 而文件传输应该跟对话传输分开 因此 应该再开一个端口 3 在线用户的扫描 本软件是通过扫描局域网内的在线用户 不一定打开软件 然后一一 发送登陆信息 如果收到登陆信息就在列表上增加用户并发送回馈 如 果收到回馈就在列表上增加用户 如果收到退出消息就删除用户 4 文件传输 原本打算使用多线程文件传输
5、及发送端开多个线程同时读一个文件并 发送 接收端在磁盘开辟一个与接收文件大小一致的一个文件 然后接 收端开多个线程接收并各自负责写进特定文件位置 不过由于 Socket 匹配问题 因此还是使用单线程传输比较简单一点 教育资料 六 六 方案实现及主要程序方案实现及主要程序 1 工程中的类 1 1 本软件中分别有三个 CAsyncSocketCAsyncSocket 的派生类 分别是 CCtrlSocketCtrlSocket CTalkSocketCTalkSocket CFileSocketCFileSocket a CCtrlSocket CCtrlSocket 用于接收及发送控制信息 包括
6、文件头为 1 登陆 2 回馈 3 退出 4 对话请求 5 对话请求的回应 的消息 对应监听端口是 CTRLPORT 3333 b CTalkSocket CTalkSocket 用于接收及发送对话信息 及部分文件控制信息 包 括文件头为 6 退出对话 7 对话 8 请求传 送 9 传送回应 的消息 对应监听端口是 TALKPORT 3334 c CFileSocketCFileSocket 用于发送及接收文件 对应监听端口是 FILEPORT 3335 其它类如 CPathDialog CFileDlg 与本设计的主要部分无紧要联系 故 不一一说明了 2 类的具体实现 1 CCtrlSocke
7、tCCtrlSocket 类 类 主要部分有 FD READFD READ 及 FD CONNECTFD CONNECT 触发的事件 OnConnectOnConnect 在建立连接后发送出相应的消息 而 OnReceiveOnReceive 在有消息到 来的情况下处理消息 voidvoid CCtrlSocket OnReceive intCCtrlSocket OnReceive int nErrorCode nErrorCode TODO Add your specialized code here and or call the base class char q 50 char t
8、unsigned int j CString tempaddr CString Ctemp UINT tempport 教育资料 this Receive q strlen q 1 0 t q 0 for j 0 jm pMainWnd pDlg UpdateData true switch t 对控制信息的判断 case 1 登陆 pDlg m listonline InsertItem 0 q this GetPeerName tempaddr tempport pDlg m listonline SetItemText 0 1 tempaddr Ctemp 2 pDlg m hostna
9、me this Send Ctemp strlen Ctemp 1 0 break case 2 回馈 pDlg m listonline InsertItem 0 q this GetPeerName tempaddr tempport pDlg m listonline SetItemText 0 1 tempaddr break case 3 退出 for j 0 jm listonline GetItemCount j if pDlg m listonline GetItemText j 0 q pDlg m listonline DeleteItem j 教育资料 break cas
10、e 4 请求对话 Ctemp Format s q Ctemp 是否接受 Ctemp 的对话请求 if AfxMessageBox Ctemp MB YESNO MB ICONQUESTION IDYES Ctemp 52 拒绝 this Send Ctemp strlen Ctemp 1 0 break else if TalkSocket m hSocket INVALID SOCKET Ctemp 6 pDlg m hostname 退出对话 断开原来对话 TalkSocket Send Ctemp strlen Ctemp 1 0 Ctemp 51 同意 this Send Ctemp
11、 strlen Ctemp 1 0 this GetPeerName tempaddr tempport pDlg GetDlgItem IDC CUT OFF EnableWindow true pDlg GetDlgItem IDC SEND MSS EnableWindow true pDlg GetDlgItem IDC SEND FILE EnableWindow true tcpSocketClose TalkSocket tcpSocketConnect TalkSocket tempaddr TALKPORT pDlg m linkip tempaddr pDlg m link
12、name Format s q 教育资料 break case 5 请求对话的回应 if q 0 1 pDlg m editrec 完成连接 r n pDlg GetDlgItem IDC CUT OFF EnableWindow true pDlg GetDlgItem IDC SEND MSS EnableWindow true pDlg GetDlgItem IDC SEND FILE EnableWindow true else if q 0 2 AfxMessageBox 对方不想与你对话或者对方正忙 else AfxMessageBox Error break default br
13、eak pDlg UpdateData false CAsyncSocket OnReceive nErrorCode voidvoid CCtrlSocket OnConnect intCCtrlSocket OnConnect int nErrorCode nErrorCode TODO Add your specialized code here and or call the base class if nErrorCode 0 this AsyncSelect FD READ CChatApp pApp CChatApp AfxGetApp 教育资料 CChatDlg pDlg CC
14、hatDlg pApp m pMainWnd pDlg UpdateData true CString Ctemp switch SendMssKind case 1 Ctemp 1 pDlg m hostname this Send Ctemp strlen Ctemp 1 0 break case 3 Ctemp 3 pDlg m hostname this Send Ctemp strlen Ctemp 1 0 break case 4 Ctemp 4 pDlg m hostname this Send Ctemp strlen Ctemp 1 0 break default break
15、 CAsyncSocket OnConnect nErrorCode 2 C CTalkTalkSocketSocket 类 类 主要部分有 FD READFD READ 及 FD CLOSEFD CLOSE 触发的事件 OnCOnCloselose 对方关掉软件后响应 而 OnReceiveOnReceive 在有消息到来的情况下处 理消息 voidvoid CTalkSocket OnReceive intCTalkSocket OnReceive int nErrorCode nErrorCode 教育资料 TODO Add your specialized code here and
16、or call the base class char q 150 unsigned int j CString tempaddr CString Ctemp CString filename CString filelen long file length char RootPathName 4 root path DWORD SectorsPerCluster sectors per cluster DWORD BytesPerSector bytes per sector DWORD NumberOfFreeClusters free clusters DWORD TotalNumberOfClusters total clusters long DiskFree this Receive q strlen q 1 0 CChatApp pApp CChatApp AfxGetApp CChatDlg pDlg CChatDlg pApp m pMainWnd pDlg UpdateData true char t q 0 for j 0 jm editrec pDlg m ed