p2p即时聊天系统Word下载.docx
- 文档编号:15103304
- 上传时间:2022-10-27
- 格式:DOCX
- 页数:18
- 大小:260.25KB
p2p即时聊天系统Word下载.docx
《p2p即时聊天系统Word下载.docx》由会员分享,可在线阅读,更多相关《p2p即时聊天系统Word下载.docx(18页珍藏版)》请在冰豆网上搜索。
3.用户界面:
界面上包括对等方列表;
消息显示列表;
消息输入框;
文件传输进程显示及操作按钮或菜单。
四、设计内容与步骤
1.学习Socket和TCP的基本原理和通信机制;
2.功能设计和界面设计
3.服务器功能的设计和实现
4.客户功能的设计和实现
5.课程设计任务说明书
五、方案设计
1.消息格式
本系统采用的消息格式是,文件头+消息内容
文件头为‘1’-‘9’,消息格式分配如下:
‘1’+本机名:
登陆,发送给所有在线对等方的服务端口
‘2’+本机名:
对登陆消息的回馈
‘3’+本机名:
退出
‘4’+本机名:
对话请求
“51”或”52”:
对话请求的回应(是否同意)
‘6’+本机名+”退出对话”:
退出对话
‘7’+对话内容:
对话
‘8’+文件名长度+文件名+文件长度(转换成CString):
请求传送
“91”同意传输
“92”拒绝
“93”磁盘已满
2.该软件分别开了3个监听端口:
3333、3334、3335。
之所以分开3个端口是因为各种传送的不同,在设计实验的过程中我发现对于登陆消息,退出消息,应该用的socket是即用即断,即比如我收到登陆消息,并发送回馈消息后就断开连接,这样就不用一个用户同时连接很多用户,如果用完不断,就是全连接了。
而文件传输应该跟对话传输分开,因此应该再开一个端口。
3.在线用户的扫描:
本软件是通过扫描局域网内的在线用户(不一定打开软件),然后一一发送登陆信息,如果收到登陆信息就在列表上增加用户并发送回馈,如果收到回馈就在列表上增加用户,如果收到退出消息就删除用户。
4.文件传输
原本打算使用多线程文件传输,及发送端开多个线程同时读一个文件并发送,接收端在磁盘开辟一个与接收文件大小一致的一个文件,然后接收端开多个线程接收并各自负责写进特定文件位置,不过由于Socket匹配问题,因此还是使用单线程传输比较简单一点。
六、方案实现及主要程序
1.工程中的类
(1).本软件中分别有三个CAsyncSocket的派生类,分别是CCtrlSocket,CTalkSocket,CFileSocket
a)CCtrlSocket:
用于接收及发送控制信息,包括文件头为‘1’(登陆);
‘2’(回馈);
‘3’(退出);
‘4’(对话请求);
’5’(对话请求的回应)的消息,对应监听端口是CTRLPORT——3333
b)CTalkSocket:
用于接收及发送对话信息,及部分文件控制信息。
包括文件头为‘6’(退出对话);
‘7’(对话);
‘8’(请求传送);
‘9’(传送回应)的消息,对应监听端口是TALKPORT——3334
c)CFileSocket:
用于发送及接收文件,对应监听端口是FILEPORT——3335
其它类如CPathDialog,CFileDlg与本设计的主要部分无紧要联系,故不一一说明了
2.类的具体实现
(1).CCtrlSocket类:
主要部分有FD_READ及FD_CONNECT触发的事件,OnConnect在建立连接后发送出相应的消息,而OnReceive在有消息到来的情况下处理消息
voidCCtrlSocket:
:
OnReceive(intnErrorCode)
{
//TODO:
Addyourspecializedcodehereand/orcallthebaseclass
charq[50];
chart;
unsignedintj;
CStringtempaddr;
CStringCtemp;
UINTtempport;
this->
Receive(q,strlen(q)+1,0);
t=q[0];
for(j=0;
j<
strlen(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);
GetPeerName(tempaddr,tempport);
m_listonline.SetItemText(0,1,tempaddr);
Ctemp="
2"
+pDlg->
m_hostname;
this->
Send(Ctemp,strlen(Ctemp)+1,0);
break;
2'
//回馈
3'
//退出
for(j=0;
pDlg->
m_listonline.GetItemCount();
{
if(pDlg->
m_listonline.GetItemText(j,0)==q)
{
pDlg->
m_listonline.DeleteItem(j);
}
}
4'
//请求对话
Ctemp.Format("
%s"
q);
是否接受"
+Ctemp+"
的对话请求?
"
;
if(AfxMessageBox(Ctemp,MB_YESNO|MB_ICONQUESTION)!
=IDYES)
{
Ctemp="
52"
//拒绝
this->
break;
}
else
if(TalkSocket.m_hSocket!
=INVALID_SOCKET)
6"
m_hostname+"
退出对话"
//断开原来对话
TalkSocket.Send(Ctemp,strlen(Ctemp)+1,0);
51"
//同意
pDlg->
GetDlgItem(IDC_CUT_OFF)->
EnableWindow(true);
GetDlgItem(IDC_SEND_MSS)->
GetDlgItem(IDC_SEND_FILE)->
_tcpSocketClose(TalkSocket);
_tcpSocketConnect(TalkSocket,tempaddr,TALKPORT);
m_linkip=tempaddr;
m_linkname.Format("
5'
//请求对话的回应
if(q[0]=='
)
m_editrec+="
完成连接\r\n"
if(q[0]=='
)
AfxMessageBox("
对方不想与你对话或者对方正忙!
);
elseAfxMessageBox("
Error!
default:
UpdateData(false);
CAsyncSocket:
OnReceive(nErrorCode);
}
OnConnect(intnErrorCode)
if(nErrorCode==0)
AsyncSelect(FD_READ);
CChatApp*pApp=(CChatApp*)AfxGetApp();
CChatDlg*pDlg=(CChatDlg*)pApp->
CStringCtemp;
switch(SendMssKind)
case1:
1"
case3:
3"
case4:
4"
default:
OnConnect(nErrorCode);
(2).CTalkSocket类:
主要部分有FD_READ及FD_CLOSE触发的事件,OnClose对方关掉软件后响应,而OnReceive在有消息到来的情况下处理消息
voidCTalkSocket:
charq[150];
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- p2p 即时 聊天 系统