欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOC文档下载  

    TCPIP网络聊天课程设计.doc

    • 资源ID:2400455       资源大小:91.50KB        全文页数:13页
    • 资源格式: DOC        下载积分:8金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要8金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    TCPIP网络聊天课程设计.doc

    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)CConnectServerDlg Dlg(strName,strServerIp,iServerPort);if(Dlg.DoModal() = IDCANCEL)return FALSE;if(!m_skMainSocket.Connect(Dlg.m_strServerIp,Dlg.m_iServerPort)if(MessageBox(NULL,"服务器连接错误","重试?",IDRETRY) = IDNO)/ExitInstance();return FALSE;iTryTimes +;elseMessage msObj;msObj.iType = FIRSTLOG;msObj.iSubType = FIRSTTIME;CString strTemp = Dlg.m_strUserName;int iLen = strTemp.GetLength();lstrcpy(msObj.strName,_T(strTemp.GetBuffer(iLen);strTemp.ReleaseBuffer();m_skMainSocket.Send(&msObj,sizeof(Message);m_skMainSocket.SetUserName(strTemp);return TRUE;if(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 <CMainFrame *>(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 < m_pClientList ->GetCount()-1; i+)CClientSocket *m_pClientSocket = static_cast < CClientSocket *>(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 < CString *>(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 < CClientSocket *>(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);SetState(HAVELOGIN);if(msContent.iType = USERLOG && msContent.iSubType = USERLOGIN)/检查用户名是否存在SetRoomName(msContent.strRoom);SetState(HAVELOGIN);else if(msContent.iType = USERSESSION && msContent.iSubType = CHANGEROOM)CString strNewRoom = msContent.strContent;SetRoomName(strNewRoom);CParseMessage Parse(pTreeView,msContent);Parse.SWitchMessage();g_cs.Unlock();CSocket:OnReceive(nErrorCode);记录用户的数据,检查用户名是否错误五、 系统功能的优缺点该系统能较好的完成客户端与客户端之间进行聊天,能支持4个主题,不同主题之间的人不能进行聊天,但没有实现服务器端查看客户端聊天记录的功能,也没有记录下聊天的内容。六、 参考文献1丁展 刘海英. VisualC+ 网络通信编程使用案例精选. 人民邮电出版社. 2004.42. 求是科技. VisualC+6.0程序设计从入门到精通. 人民邮电出版社.2006.1.1 3任泰明.TCP/IP网络编程.人民邮电出版社.2009.8

    注意事项

    本文(TCPIP网络聊天课程设计.doc)为本站会员(laozhun)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开