TCPIP网络聊天课程设计.doc_第1页
TCPIP网络聊天课程设计.doc_第2页
TCPIP网络聊天课程设计.doc_第3页
TCPIP网络聊天课程设计.doc_第4页
TCPIP网络聊天课程设计.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

tcp/ip和网络编程课程设计题目:网上聊天姓名学号 指导教师二零一零年月日一、 系统功能描述使用socket实现网上聊天功能。用户可以通过客户端连接到服务器端并进行网上聊天。当然,聊天时可以启动多个客户端。服务器支持多个主题,进入服务器后可选定主题,启动客户端后,输入服务器的ip地址即可。用户聊天必须处于同一个主题中。二、 系统的模块划分服务器端:caboutdlg:生成关于的对话框类ccchatserverapp:对应用程序进行初始化ccchatserverdoc、 ccchatserverview:一份文档可以有多个相关的视图,当用户在文档上打开一个窗口时,框架创建一个视图并将其与文档连接。cclientsocket:设置非阻塞,将前台的界面处理和后台的网络通信都整合到消息传递模型。获取输入的用户名,聊天室列表。cinifile:可以读取.修改变量数值,可以设置新的组,新的变量cmainframe:创建应用程序主窗口,使之以树菜单保持展开状态cmyformview:在程序中应用窗体,可将新窗体插入。cmytreeview:将聊天室列表以树形排列,并实现用户发送消息的方法。cparsemessage:实现信息的传输。cserversocket:实现多个客户端的登录。csetserverportdlg:设定连接的端口。message:建立一个结构体,设定房间名、用户名、以及发送内容的类型和长度。客户端:cchatclientapp:实现客户端与服务器端的连接。chatclientdoc:从服务器端获取聊天室内房间的名称的文本。cclientformview:初始化房间的名称。cclientlog:显示上次登录的用户名的对话框。cconnectserverdlg:客户端与服务器端的连接的对话框。cinifile:读取当前目录下的ini文件。cshowmessage:显示其他客户端发送的消息。cparsemessage:用户登录时的所选择登陆端口,ip,用户名的对话框。cmytreeview:客户端上显示的树形列表,以及可实现发送消息头像闪动等。三、 调试数据首先启动服务器端分别启动两个客户端,用户名为a 、b将两个用户进入同一频道a向b发送消息b收到消息回复a发送的消息a收到b的消息四、 主要代码客户端:if(!m_skmainsocket.create()afxmessagebox(端口创建错误);return false;int itrytimes = 0;cstring strname;if(!inifile.create(username.ini,1)afxmessagebox(初始化文件不存在);return false;cstring strserverip;int iserverport;inifile.getvarstr(username,defualtname,strname);if(!inifile.getvarstr(serverip,defualtserverip,strserverip)strserverip = _t(127.0.0.1);if(!inifile.getvarint(serverport,defaultserverport,iserverport)iserverport = 1080;while(itrytimes =3)afxmessagebox(已经重试3次,退出);return false;return true;这是关于客户端登录服务器端的代码void cshowmessage:onok() / todo: add extra validation here/得到当前按钮的文本cstring strbuttontitle;getdlgitemtext(idok,strbuttontitle);/杀死接受用户信息时启动的ontimercmainframe * pframe;pframe = (cmainframe *)afxgetmainwnd();assert(pframe != null);assert_valid(pframe);cmytreeview * pview;pview = (cmytreeview * )pframe -gettreeview();pview -killtimer(iid);/恢复任务栏图标theapp.taskicon.hicon = theapp.loadicon(idi_taskicon);shell_notifyicon(nim_modify,&theapp.taskicon);/删除接受用户输入时创建的新的链表项pview-deleteoneclient(m_strclientname,iid);if(strbuttontitle = 回复)m_strmessage = ;updatedata(false);setdlgitemtext(idok,发送);getdlgitem(idc_message)-setfocus();else/回复发送人updatedata();if(m_strmessage.getlength()/填充message结构message msobj;memset(&msobj,0,sizeof(message);msobj.itype = usersession;msobj.isubtype = sayinprivate;cstring strtemp = theapp.m_skmainsocket.getroomname();int ilen = strtemp.getlength();lstrcpy(msobj.strroom,_t(strtemp.getbuffer(ilen);strtemp.releasebuffer();strtemp = m_strmessage;ilen = strtemp.getlength();ilen 1024 ? 1024 : ilen;lstrcpy(msobj.strcontent,_t(strtemp.getbuffer(ilen);strtemp.releasebuffer();theapp.m_skmainsocket.send(&msobj,sizeof(message);/自己的名字strtemp = theapp.m_skmainsocket.getusername();ilen = strtemp.getlength();ilen 20 ? 20:ilen;lstrcpy(msobj.strname,_t(strtemp.getbuffer(ilen);strtemp.releasebuffer();/说话对象的名字strtemp =m_strclientname;ilen = strtemp.getlength();ilen 20 ? 20 : ilen;lstrcpy(msobj.strclientname,_t(strtemp.getbuffer(ilen);strtemp.releasebuffer();/发送数据theapp.m_skmainsocket.send(&msobj,sizeof(message);cdialog:onok();void cshowmessage:oncancel() / todo: add extra cleanup heretheapp.m_skmainsocket.setbmessage(false);/杀死接受用户信息时启动的ontimercmainframe * pframe;pframe = (cmainframe *)afxgetmainwnd();assert(pframe != null);assert_valid(pframe);cmytreeview * pview;pview = (cmytreeview * )pframe -gettreeview();pview -killtimer(iid);pview-deleteoneclient(m_strclientname,iid);/恢复任务栏图标theapp.taskicon.hicon = theapp.loadicon(idi_taskicon);shell_notifyicon(nim_modify,&theapp.taskicon);cdialog:oncancel();这是客户端在接收到另一客户端发来信息时所能操作的代码服务器端:void cclientsocket:onreceive(int nerrorcode) cmainframe * pframe = static_cast (afxgetmainwnd();cmytreeview * ptreeview = pframe-gettreeview();message mscontent;memset(&mscontent,0,sizeof(mscontent);/得到数据receive(&mscontent,sizeof(mscontent);/处理数据/用户第一次登陆,cclientsocket中保存信息g_cs.lock();if(mscontent.itype = firstlog)/ & mscontent.isubtype = firsttime)/static bool bfirst = true;if(mscontent.isubtype = firsttime)theapp.m_pclientsocketlist-addtail(this);cptrlist * m_pclientlist = theapp.m_pclientsocketlist;int icount = m_pclientlist-getcount();position pos = m_pclientlist -getheadposition();if(pos) cstring strusername = mscontent.strname;for(int i = 0; i getcount()-1; i+)cclientsocket *m_pclientsocket = static_cast (m_pclientlist-getnext(pos);if(m_pclientsocket -getusername() = strusername)message msobj;memset(&msobj,0,sizeof(message);msobj.itype = syserror;msobj.isubtype = userexsit;send(&msobj,sizeof(message);return;message msobj;:zeromemory(&msobj,sizeof(msobj);msobj.itype = userlog;msobj.isubtype = roomlist;if(theapp.m_chatroomlist.getcount()position pos = theapp.m_chatroomlist.getheadposition();if(pos)for(int i = 0 ; i theapp.m_chatroomlist.getcount();i +)cstring * m_pstrroom = static_cast (theapp.m_chatroomlist.getnext(pos);assert(m_pstrroom != null);int ilen = m_pstrroom-getlength();ilen 20 ? ilen : 20;lstrcpy(msobj.strroom,m_pstrroom-getbuffer(ilen);send(&msobj,sizeof(msobj);sleep(200);/发送所有的用户资料msobj.itype = userlog;msobj.isubtype = userlist;cptrlist * m_pclientlist = theapp.m_pclientsocketlist;pos = m_pclientlist -getheadposition();int icount = m_pclientlist -getcount();if(pos & icount 0)cclientsocket * m_pclientsocket;for(int i = 0; i icount-1; i+)m_pclientsocket = static_cast (m_pclientlist-getnext(pos);cstring strtemp = m_pclientsocket -getroomname();int ilen = strtemp.getlength();ilen 20 ? 20 : ilen;lstrcpy(msobj.strroom,strtemp.getbuffer(ilen);strtemp.releasebuffer();strtemp = m_pclientsocket -getusername();ilen = strtemp.getlength();ilen 20 ? 20 : ilen;lstrcpy(msobj.strname,strtemp.getbuffer(ilen);strtemp.releasebuffer();send(&msobj,sizeof(msobj);sleep(100);g_cs.unlock();setusername(mscontent.strname)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论