- 1、本文档共19页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
p2p即时聊天系统
课程设计题目
基于P2P的局域网即时通信系统
实验环境及工具
计算机:PC机,PC虚拟机,
操作系统:Windows2000,WindowsXP
程序设计语言: VC 6.0
设计要求
实现一个图形用户界面局域网内的消息系统。
功能:建立一个局域网内的简单的P2P消息系统,程序既是服务器又是客户,服务器端口使用3333。
用户注册及对等方列表的获取:对等方A启动后,用户设置自己的信息(用户名,所在组);扫描网段中在线的对等方(3333端口打开),向所有在线对等方的服务端口发送消息,接收方接收到消息后,把对等方A加入到自己的用户列表中,并发应答消息;对等方A把回应消息的其它对等方加入用户列表。双方交换的消息格式自己根据需要定义,至少包括用户名、IP地址。
发送消息和文件:用户在列表中选择用户,与用户建立TCP连接,发送文件或消息。
用户界面:界面上包括对等方列表;消息显示列表;消息输入框;文件传输进程显示及操作按钮或菜单。
设计内容与步骤;
课程设计任务说明书‘1’-‘9’,消息格式分配如下:
‘1’+本机名:登陆,发送给所有在线对等方的服务端口
‘2’+本机名:对登陆消息的回馈
‘3’+本机名:退出
‘4’+本机名:对话请求
“51”或”52”:对话请求的回应(是否同意)
‘6’+本机名+”退出对话”:退出对话
‘7’+对话内容:对话
‘8’+文件名长度+文件名+文件长度(转换成CString):请求传送
“91”同意传输
“92”拒绝
“93”磁盘已满
该软件分别开了3个监听端口:3333、3334、3335。之所以分开3个端口是因为各种传送的不同,在设计实验的过程中我发现对于登陆消息,退出消息,应该用的socket是即用即断,即比如我收到登陆消息,并发送回馈消息后就断开连接,这样就不用一个用户同时连接很多用户,如果用完不断,就是全连接了。而文件传输应该跟对话传输分开,因此应该再开一个端口。
在线用户的扫描:本软件是通过扫描局域网内的在线用户(不一定打开软件),然后一一发送登陆信息,如果收到登陆信息就在列表上增加用户并发送回馈,如果收到回馈就在列表上增加用户,如果收到退出消息就删除用户。
文件传输原本打算使用多线程文件传输,及发送端开多个线程同时读一个文件并发送,接收端在磁盘开辟一个与接收文件大小一致的一个文件,然后接收端开多个线程接收并各自负责写进特定文件位置,不过由于Socket匹配问题,因此还是使用单线程传输比较简单一点。
方案实现及主要程序
工程中的类
本软件中分别有三个CAsyncSocket的派生类,分别是CCtrlSocket,CTalkSocket,CFileSocket
CCtrlSocket:用于接收及发送控制信息,包括文件头为‘1’(登陆); ‘2’(回馈);‘3’(退出); ‘4’(对话请求);’5’(对话请求的回应)的消息,对应监听端口是CTRLPORT——3333
CTalkSocket:用于接收及发送对话信息,及部分文件控制信息。包括文件头为‘6’(退出对话); ‘7’(对话); ‘8’(请求传送); ‘9’(传送回应)的消息,对应监听端口是TALKPORT——3334
CFileSocket:用于发送及接收文件,对应监听端口是FILEPORT——3335
其它类如CPathDialog,CFileDlg与本设计的主要部分无紧要联系,故不一一说明了
类的具体实现
CCtrlSocket类:主要部分有FD_READ及 FD_CONNECT触发的事件,OnConnect在建立连接后发送出相应的消息,而OnReceive在有消息到来的情况下处理消息
void CCtrlSocket::OnReceive(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
char q[50];
char t;
unsigned int j;
CString tempaddr;
CString Ctemp;
UINT tempport;
this-Receive(q,strlen(q)+1,0);
t=q[0];
for(j=0;jstrlen(q);j++)
{
q[j]=q[j+1];
}
CChatApp *pApp=(CChatApp *) AfxGetApp();
CChatDlg *pDlg = (CChatDlg *) pApp-m_pMainWnd;
pDlg-UpdateData(true);
switch(t)//对控制信息的判断
{
case 1://登陆
pDlg-m_listonline.InsertItem(0,q);
文档评论(0)