TCPIP网络聊天课程设计.doc

上传人:laozhun 文档编号:2400455 上传时间:2023-02-17 格式:DOC 页数:13 大小:91.50KB
返回 下载 相关 举报
TCPIP网络聊天课程设计.doc_第1页
第1页 / 共13页
TCPIP网络聊天课程设计.doc_第2页
第2页 / 共13页
TCPIP网络聊天课程设计.doc_第3页
第3页 / 共13页
TCPIP网络聊天课程设计.doc_第4页
第4页 / 共13页
TCPIP网络聊天课程设计.doc_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《TCPIP网络聊天课程设计.doc》由会员分享,可在线阅读,更多相关《TCPIP网络聊天课程设计.doc(13页珍藏版)》请在三一办公上搜索。

1、TCP/IP和网络编程课程设计题目:网上聊天姓名学号 指导教师二零一零年月日一、 系统功能描述使用Socket实现网上聊天功能。用户可以通过客户端连接到服务器端并进行网上聊天。当然,聊天时可以启动多个客户端。服务器支持多个主题,进入服务器后可选定主题,启动客户端后,输入服务器的IP地址即可。用户聊天必须处于同一个主题中。二、 系统的模块划分服务器端:CAboutDlg:生成关于的对话框类CCChatServerApp:对应用程序进行初始化CCChatServerDoc、 CCChatServerView:一份文档可以有多个相关的视图,当用户在文档上打开一个窗口时,框架创建一个视图并将其与文档连

2、接。CClientSocket:设置非阻塞,将前台的界面处理和后台的网络通信都整合到消息传递模型。获取输入的用户名,聊天室列表。CINIFILE:可以读取.修改变量数值,可以设置新的组,新的变量CMainFrame:创建应用程序主窗口,使之以树菜单保持展开状态CMyFormView:在程序中应用窗体,可将新窗体插入。CMyTreeView:将聊天室列表以树形排列,并实现用户发送消息的方法。CParseMessage:实现信息的传输。CServerSocket:实现多个客户端的登录。CSetServerPortDlg:设定连接的端口。Message:建立一个结构体,设定房间名、用户名、以及发送内

3、容的类型和长度。客户端:CChatClientApp:实现客户端与服务器端的连接。ChatClientDoc:从服务器端获取聊天室内房间的名称的文本。CClientFormView:初始化房间的名称。CClientLog:显示上次登录的用户名的对话框。CConnectServerDlg:客户端与服务器端的连接的对话框。CIniFile:读取当前目录下的ini文件。CShowMessage:显示其他客户端发送的消息。CParseMessage:用户登录时的所选择登陆端口,IP,用户名的对话框。CMyTreeView:客户端上显示的树形列表,以及可实现发送消息头像闪动等。三、 调试数据首先启动服务

4、器端分别启动两个客户端,用户名为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,D

5、EFUALTNAME,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() /

6、 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 -Kil

7、lTimer(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();els

8、e/回复发送人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);strTe

9、mp.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();iL

10、en 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(Messag

11、e);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 -GetTree

12、View();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 = sta

13、tic_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

14、= 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;

15、 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(msOb

16、j);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)

17、;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 iCou

18、nt = 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.G

19、etBuffer(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);i

20、f(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)

21、;Parse.SWitchMessage();g_cs.Unlock();CSocket:OnReceive(nErrorCode);记录用户的数据,检查用户名是否错误五、 系统功能的优缺点该系统能较好的完成客户端与客户端之间进行聊天,能支持4个主题,不同主题之间的人不能进行聊天,但没有实现服务器端查看客户端聊天记录的功能,也没有记录下聊天的内容。六、 参考文献1丁展 刘海英. VisualC+ 网络通信编程使用案例精选. 人民邮电出版社. 2004.42. 求是科技. VisualC+6.0程序设计从入门到精通. 人民邮电出版社.2006.1.1 3任泰明.TCP/IP网络编程.人民邮电出版社.2009.8

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号