课程设计简易聊天程序设计
- 格式:docx
- 大小:264.81 KB
- 文档页数:26
实验报告实验报告名称:简易聊天程序学生姓名:学生学号:实验日期:2013 –12—20实验报告内容一.简介本程序是一个简易的聊天程序,在程序里涉及到了网络通信基本理和Socket编程技术。
由于程序是在IP环境下运行,所以分服务器端和客户端,服务器端和客户端是通过建立Socket链接来实现聊天功能。
套接字(Socket)是一种双向的通信接口,可以通过这个端口与任何一个具有Socket端口的计算机通信,套接字是网络通信的基础。
使用Socket进行网络通信必须包含下面的几种信息:双方认可的协议,本地主机的IP地址,对方主机的IP地址,本地进程的协议端口,对方进程的协议端口。
下面是文本聊天部分所要完成的功能:1.在这个系统中只要在线就可以和所有使用此程序的且已经在线的朋友进行聊天,每个人有可以有一个昵称,当开始进入时,会在每个人的窗口弹出“有一个游客已经进入”。
2.当输入完聊天信息以后进行发送,当发送没有结束时,不能进行新的聊天内容的输入。
一般聊天内容一次不能超过500个字符。
3.工作流程图大致如下:4. 进行聊天需要建立服务器端Socket和客户端Socket,并且要连接上,这样才能进行信息的传送。
二.操作步骤1.创建对话框类chat,在向导的第2步骤中,选中windows Sockets.2.设计对话框“我的聊天程序”,添加相应的控件及其控件变量3.添加并设计服务端端口类和客户端端口类三:通信模块关键代码分析:(1)//服务器端对客户端Socket的处理代码void CChatDlg::ProcessPendingAccept(){CClientSocket* pSocket = new CClientSocket();if (m_pListenSocket.Accept(*pSocket)){CPackMessg msg;msg.m_strText="一个游客进入聊天室了";// m_strShowMessage+="一个游客进入聊天室了\n";SetDlgItemText(IDC_SHOWMESSAGE,"一个游客进入聊天室了\n");POSITION pos;for(pos=m_connectionList.GetHeadPosition();pos!=NULL;){CClientSocket * t= (CClientSocket *)m_connectionList.GetNext(pos);t->SendMessage(&msg);}pSocket->Init(this);m_connectionList.AddTail(pSocket);}elsedelete pSocket;}(2)//客户端连接到服务器的消息相应函数void CChatDlg::OnConnect(){// TODO: Add your control notification handler code hereif(!m_bInit){BYTE f0,f1,f2,f3;CString name;((CIPAddressCtrl*)(GetDlgItem(IDC_IPADDRESS)))->GetAddress(f0,f1,f2,f3);CString ip;ip.Format("%d.%d.%d.%d",f0,f1,f2,f3);m_bClient=true;m_clientsocket.Create();if(m_clientsocket.Connect(ip,GetDlgItemInt(IDC_PORT))){m_clientsocket.Init(this);SetDlgItemText(IDC_SHOWMESSAGE,"客户端连接成功!");m_bInit=true;}else{m_clientsocket.Close();AfxMessageBox("客户端连接失败!");m_bInit=false;}}}(3)//建立服务器端的消息相应函数void CChatDlg::OnSetserver(){// TODO: Add your control notification handler code hereif(!m_bInit){m_bClient=false;m_bInit=true;if(m_pListenSocket.Init(GetDlgItemInt(IDC_PORT),this)==FALSE){m_bInit=false;return;}}}(4)CServerSocket是服务器端Socket类,关于这部分的核心代码为:BOOL CServerSocket::Init(UINT port, CChatDlg* dlg){ //服务器端初始化m_uPort=port;m_dlg=dlg;if(Create(m_uPort)==FALSE){AfxMessageBox("服务器套接字创建失败!");return FALSE;}if(this->Listen()==FALSE){AfxMessageBox("服务器监听错误!");return FALSE;}m_dlg->SetDlgItemText(IDC_SHOWMESSAGE,"服务器创建成功!");return TRUE;}//有连接接入的时候触发该事件void CServerSocket::OnAccept(int nErrorCode){// TODO: Add your specialized code here and/or call the base classm_dlg->ProcessPendingAccept();CSocket::OnAccept(nErrorCode);}(5)CClientSocket是客户端Socket类,核心代码:1.//通信Socket的初始化,一些关于传输数据可序列化的操作:void CClientSocket::Init(CChatDlg * dlg){m_sfSocketFile= new CSocketFile(this);m_aSessionIn=new CArchive(m_sfSocketFile,CArchive::load);m_aSessionOut=new CArchive(m_sfSocketFile,CArchive::store);m_bClose=false;this->m_dlg=dlg;}2.//Socket 接收到传输过来的数据的消息映射函数:void CClientSocket::OnReceive(int nErrorCode){// TODO: Add your specialized code here and/or call the base classCSocket::OnReceive(nErrorCode);do{CPackMessg temp;temp.Serialize(*m_aSessionIn);m_dlg->m_sMsgList+=temp.m_strText+"\r\n";m_dlg->SetDlgItemText(IDC_SHOWMESSAGE,m_dlg->m_sMsgList);int linenum=((CEdit *)(m_dlg->GetDlgItem(IDC_SHOWMESSAGE)))->GetLineCount();((CEdit*)(m_dlg->GetDlgItem(IDC_SHOWMESSAGE)))->LineScroll(linenum);//如果是服务端还需要将接收到的数据转发到其他客户端if(!m_dlg->m_bClient){for(POSITIONpos=m_dlg->m_connectionList.GetHeadPosition();pos!=NULL;){CClientSocket * t = (CClientSocket*)m_dlg->m_connectionList.GetNext(pos);if(t->m_hSocket!=this->m_hSocket){t->SendMessage(&temp);}}}}while (!m_aSessionIn->IsBufferEmpty());}3.//发送数据到另一端BOOL CClientSocket::SendMessage(CPackMessg * msg) {if (m_aSessionOut != NULL){msg->Serialize(*m_aSessionOut);m_aSessionOut->Flush();return TRUE;}else{//对方关闭了连接m_bClose=true;CloseSocket();m_dlg->CloseSessionSocket();return FALSE;}}4.//关闭Socket,需要将可序列化相关的内存释放void CClientSocket::CloseSocket(){if(m_aSessionIn){delete m_aSessionIn;m_aSessionIn=NULL;}if(m_aSessionOut){delete m_aSessionOut;m_aSessionOut=NULL;}if(m_sfSocketFile){delete m_aSessionOut;m_sfSocketFile=NULL;}Close();m_bInit=false;m_bClose=true;}5.//Socket 接收到对方Socket关闭的消息后的响应函数void CClientSocket::OnClose(int nErrorCode){CSocket::OnClose(nErrorCode);m_bClose=true;CloseSocket();m_dlg->CloseSessionSocket();CSocket::OnClose(nErrorCode);}。
操作系统课程设计任务书操作系统课程设计说明书学院名称:计算机与信息工程学院班级名称:网络工程113班学生姓名:柯焱芳谢娟娟刘瑶靳梦婷束道华学号: 2011211384 2011211419 20112113912011211383 2011211404题目:进程通信指导教师姓名:王汇彬起止日期:2013年6月3日-2013年6月30日第一部分:正文部分一、选题背景为了提高计算机系统的效率。
增强计算机系统内各种硬件的并行操作能力。
操作系统要求程序结构必须适应并发处理的需要,为此引入了进程的概念。
进程是操作系统的核心,所有基于多道程序设计的操作系统都建立在进程的概念之上。
目前的计算机系统均提供了多任务并行环境。
无论是应用程序还是系统程序,都需要针对每一个任务创建相应的进程。
进程是设计和分析操作系统的有力工具。
然而不同的进程之间,即使是具有家族联系的父子进程,都具有各自不同的进程映像。
由于不同的进程运行在各自不同的内存空间中,一方对于变量的修改另一方是无法感知的。
因此,进程之间的信息传递不可能通过变量或其它数据结构直接进行,只能通过进程间通信来完成。
要实现实现进程通信有多种方法,在课程设计中,使用Socket通信方式进行通信,实现两台计算机之间的进程通信。
二、设计理念课程设计要求根据进程通信的方式和类型,以及进程通信的实现方法,实现一个简单的聊天程序,聊天程序包括客户端与服务器两部分。
首先要满足在同一个计算机上可以进行通信,在这个基础上可以实现一对一两台计算机之间的通信。
2.1整体设计需求分析根据课题要求:根据进程通信的方式和类型,以及进程通信的实现方法,实现一个简单的聊天程序,聊天程序包括客户端与服务器两部分。
要选择合适的通信方式能够使客户端和器端断建立连接,聊天就需要有聊天界面,使用户可以通过界面进行通信。
2.2服务器端需求分析服务器端需要建立一个端口提供给客户端监听,在建立端口后不断进行监听是否有客户端连接或者断开连接,若有客户端监听其端口,便建立连接进行通信。
程序设计报告之简易聊天软件的设计与实现----bf7c647e-7162-11ec-b191-7cb59b590d7d(2021/2021学年第二学期)标题:简单聊天软件的设计与实现学生姓名班级学号指导教师指导单位:计算机科学与技术系,计算机科学学院,日期:2022年3月28日简易聊天软件的设计与实现二、主题内容和要求1、课题内容:本课程设计主要是设计并实现一个简单的聊天程序,创建基于多线程的聊天室程序。
2.主题要求:需要实现基本的聊天功能。
该聊天室允许两台电脑进行聊天,但需要获取两台电脑之间的IP地址进行聊天,才能实现一对一的聊天。
1、该程序实现局域网内的聊天功能,包括服务器端程序和客户端程序两部分。
客户端程序:它可以连接到服务器,向服务器发送消息,并接受服务器发送的消息。
服务器端程序:负责发送用户列表,转发客户端发送的消息。
这个程序涉及服务器和客户端,使用相同的套接字。
2、该聊天软件是采用udp连接,udp是osi参考模型中一种无连接的传输层协议,它提供了简单不可靠的信息传送服务。
由于udp比较简单,udp包含很少的字节,所以它在速度方面有很大优势。
很多常用的即时通软件,如qq程序,都会使用udp实现很多基本功能。
udp是“面向非连接”的网络协议,它与“面向连接”的tcp协议对应。
在发送数据之前,并不与对方建立连接,而是直接把数据报发出去,不保证可靠的传输。
udp相对tcp简单,在速度方面有很大优势,因为它的网络开销少,对传输可靠性要求不是很高的情况下,udp的使用是网络程序的首选。
3.为了实现聊天功能,我们必须获取两台计算机的IP地址。
在IP地址控制栏中输入参与聊天对象的计算机的IP地址。
4、本程序的核心在于将消息的发送的和接收发在了两个不同的线程中,接收放在新创建的副进程中,因为其要一直处于响应状态,也就是需要一个while循环;发送放在主线程中。
这样消息的接收和发送就不存在先后顺序了,且一直处于循环中的接收也不会影响到发送。
java课程设计聊天小一、教学目标本节课的教学目标是让学生掌握Java编程语言的基本语法和面向对象编程思想,通过编写一个简单的聊天小应用程序,培养学生解决实际问题的能力。
具体目标如下:1.知识目标:–掌握Java基本数据类型、运算符、控制结构;–理解面向对象编程的基本概念,如类、对象、封装、继承、多态;–熟悉Java编程语言的常用开发工具和环境。
2.技能目标:–能够运用Java编程语言编写简单的程序;–能够运用面向对象编程思想设计和实现程序;–能够利用Java开发工具进行程序的编译和运行。
3.情感态度价值观目标:–培养学生对编程语言的兴趣和好奇心;–培养学生解决问题的能力和团队合作精神;–培养学生热爱科学、追求创新的精神。
二、教学内容本节课的教学内容主要包括以下几个部分:1.Java基本语法:数据类型、运算符、控制结构;2.面向对象编程:类、对象、封装、继承、多态;3.Java开发工具和环境:Eclipse或IntelliJ IDEA的使用。
通过讲解和示例,让学生了解和掌握Java编程语言的基本语法和面向对象编程思想,最终能够编写一个简单的聊天小应用程序。
三、教学方法为了达到本节课的教学目标,我们将采用以下教学方法:1.讲授法:讲解Java基本语法和面向对象编程思想;2.案例分析法:分析实际编程案例,让学生更好地理解和掌握知识;3.实验法:让学生动手实践,编写聊天小应用程序,提高实际操作能力。
四、教学资源为了支持本节课的教学内容和教学方法的实施,我们将准备以下教学资源:1.教材:《Java编程思想》;2.参考书:《Java核心技术》;3.多媒体资料:教学PPT、视频教程;4.实验设备:计算机、网络环境。
通过以上教学资源的使用,丰富学生的学习体验,提高学习效果。
五、教学评估本节课的教学评估将采用多种方式,以全面、客观、公正地评价学生的学习成果。
评估方式包括:1.平时表现:通过学生在课堂上的参与度、提问回答、小组讨论等表现,评估其对知识的掌握和应用能力。
课程设计报告课程名称:面向对象程序设计 C++设计题目:简易聊天程序设计专业:计算机科学与技术______ 姓名:金文指导教师:李晓虹2015 年1 月10 日(一)系统需求分析用户角度考察系统应具有哪些功能及非功能性需求。
能实现用户注册、用户的登录、各客户端能连接起来,服务器能与客户端相连实现用户之间信息的发送与共享。
(二)总体设计1初始化socket,创建服务器端2、维护一个链表,保存所有用户的IP地址、端口信息3、接受用户传送来的聊天信息,然后向链表中的所用用户转发4、接受用户传送来的连接判断命令,并向用户发出相应命令根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
建立服务器显示本机IP地址建立连接提示连接成功J#*"""-在另一台机器上运行聊天程序Jr.进行聊天输入服务器IP地址清除聊天输入名子建立聊天关闭服务器提示连接成功或失败提示有某个服务器正在连接,是否连接进行聊天退出清除聊天内容断开连接(三)详细设计ChatClient:运行界面:名 I 金文珍T____ .. ___________________________________ _________________________________________ I服务 127.0.0,1!鬧疋■nn去 |6 勺 取消连接服务器:IDD_SENDDLG重要代码:void CChatClientDoc::talk(int type, CString form, CString to, CString str, COLORREF clr){CChatClientView* pView = (CChatClientView*)GetView();if(form != m_strHandle && to != m_strHandle && m_bFilter) return;CString temp,to2,first,second;if(type > 32 || type < 0)return;temp.LoadString(IDS_TALKO + type);int i=temp.Find(",");if(i != -1){first = temp.Left(i);if(i != temp.GetLength() - 1){second = temp.Mid(i + 1); second +="";}else{ second="";}pView->TextOut((LPCTSTR)form, RGB(0,0,255)); pView->TextOut((LPCTSTR)first,RGB(0,0,0)); pView->TextOut((LPCTSTR)to, RGB(0,0,255));pView->TextOut((LPCTSTR)second, RGB(0,0,0)); pView->TextOut((LPCTSTR)str,clr);pView->TextOut((LPCTSTR)"\r\n,,,clr);}else{first=temp; second=":"; pView->TextOut(form,RGB(0,0,255));pView->TextOut(first,RGB(O,O,O)); pView->TextOut(second,RGB(0,0,0));pView->TextOut(str,clr); pView->TextOut("\r\n",clr);}}void CChatClientDoc::Disconnect(){msg.type = -2;msg.m_bClose = TRUE;msg.from = m_strHandle;msg.to = "所有人";msg.secret = FALSE;msg.m_strText ="Hello";msg.color = RGB(0,136,255);SendMsg();m_bConnected = FALSE;msg.from = "DUMP";GetView()->GetParent()->SendMessage(WM_ADDLIST + 1, (LPARAM)&(msg.from), msg.image); }void CChatClientView::TextOut(LPCTSTR lpszMessage, COLORREF clr){cfm.cbSize=sizeof(cfm); // CHARFORMAT cfm cfm.crTextColor=clr; cfm.dwMask=CFM_COLOR;CString strTemp = lpszMessage;int len = GetWindowTextLength();GetRichEditCtrl().SetSel(len,len);GetRichEditCtrl().SetSelectionCharFormat(cfm);GetRichEditCtrl().ReplaceSel(strTemp);}void CChatSocket::OnReceive(int nErrorCode){CSocket::OnReceive(nErrorCode);m_pDoc->ProcessPendingRead();}void CChatClientCntrItem::Dump(CDumpContext& dc) const{CRichEditCntrItem::Dump(dc);}void CLogin::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CLogin)DDX_CBString(pDX, IDC_IMAGE, m_strImage);DDX_CBString(pDX, IDC_NAME, m_strName);DDX_Text(pDX, IDC_SERVER, m_strServerIP); //}}AFX_DATA_MAP}BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) {if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE;cs.style &= ~WS_MAXIMIZEBOX;cs.style &= ~WS_SIZEBOX;cs.cx = 640;cs.cy = 480;return TRUE;}CMessage::CMessage(){image = 6;type = 0;secret = FALSE;color = RGB(0,136,255);m_bClose = FALSE;from = to = m_strText = _T("");}CMessage::~CMessage(){}void CMessage::Serialize(CArchive &ar) {if (ar.IsStoring()){ar <<type;ar <<(WORD)m_bClose; ar <<m_strText;ar <<(WORD)secret; ar <<from;ar <<to;ar <<(DWORD)color;ar <<image;}else{WORD wd;DWORD dwTmp;ar >>type;ar >>wd;m_bClose = (BOOL)wd;ar >>m_strText;ar >>wd; secret = (BOOL)wd;ar >>from;ar >>to;ar >>dwTmp;color = (COLORREF)dwTmp;ar >>image;}/*m_msgList.Serialize(ar); fromlist.Serialize(ar); tolist.Serialize(ar);seclist.Serialize(ar); typelist.Serialize(ar); clrlist.Serialize(ar);*/} void CMessage::Reset(){image = 6;type = 0; secret = FALSE;color = RGB(0,136,255); m_bClose = FALSE;from = to = m_strText = _T("");/* m_msgList.RemoveAll(); fromlist.RemoveAll(); tolist.RemoveAll(); seclist.RemoveAll();clrlist.RemoveAll(); typelist.RemoveAll();*/}int COnlineBar::OnCreate(LPCREATESTRUCT lpCreateStruct){if (CDialogBar::OnCreate(lpCreateStruct) == -1) return -1;CRect rect;GetClientRect(&rect);rect.left += 8;rect.top += 15;rect.right -= 8;rect.bottom -= 8;m_ListCtrl = new COnlineList;if (!m_ListCtrl->Create(WS_CHILD | WS_VISIBLE | LVS_REPORT, rect, this, IDC_LISTBOX)) {TRACE0("Failed to create view for CMyBarLeft\n"); return -1;}m_ListCtrl->ModifyStyleEx(0, WS_EX_CLIENTEDGE); AddExStyle(LVS_EX_FULLROWSELECT | LVS_OWNERDRAWFIXED);int i;LV_COLUMN lvc;lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; CString strTemp[2] = {"名称", "IP"};int size[2] = {140,40};for(i = 0; i < 2; i++){ lvc.iSubItem = i; lvc.pszText = (char*)(LPCTSTR)strTemp[i]; lvc.cx = size[i];lvc.fmt = LVCFMT_LEFT; m_ListCtrl->InsertColumn(i, &lvc);}return 0;}void COnlineBar::AddExStyle(DWORD dwNewStyle) {DWORD dwStyle = ::SendMessage (m_ListCtrl->m_hWnd, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0);dwStyle |= dwNewStyle;::SendMessage (m_ListCtrl->m_hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE,0, dwStyle);}int COnlineList::OnCreate(LPCREATESTRUCT lpCreateStruct){if (CListCtrl::OnCreate(lpCreateStruct) == -1) return -1;m_imgList.Create(IDB_IMAGE, 16, 1, RGB(0, 255, 0));HIMAGELIST him = m_imgList.m_hImageList;::SendMessage(this->m_hWnd,LVM_SETIMAGELIST,(WPARAM)LVSIL_SMALL,(LPARAM )him);//::SendMessage(this->m_hWnd,LVM_SETIMAGELIST,(WPARAM)LVSIL_NORMAL,(LPAR AM)him);ImageList_SetBkColor(him,CLR_NONE);return 0;}void COnlineList::AddItem(short i, char* name, char* text){LVITEM lvi;lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;lvi.iItem = GetItemCount();lvi.iImage = i;lvi.iSubItem = 0;lvi.pszText = name;hTextMax = 64;lvi.lParam = 0;InsertItem(&lvi);lvi.mask = LVIF_TEXT;lvi.pszText = text;hTextMax = 32;lvi.iSubItem = 1;SetItem(&lvi);}void COnlineList::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult){NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;CString str;int iSel = pNMListView->iItem;if (iSel >= 0 ){str = GetItemText(iSel,0);CWnd* pParentWnd = GetParent(); while (pParentWnd != NULL){ if(pParentWnd->IsFrameWnd()){ break;} pParentWnd = pParentWnd->GetParent();}if (pParentWnd != NULL) pParentWnd->SendMessage(WM_DBCLICKITEM, 0, (LPARAM)&str);}*pResult = 0;}void COnlineList::Remove(char *name){CString str;for(int i = 0; i <GetItemCount(); i++){str = GetItemText(i,0); if(strcmp(str, name) == 0){ DeleteItem(i); break;}}}Charsrv:r 菜单设计( IDR_MAINFRAME)对话框设计:IDD ABOUTBOX'请畴簧矚出聊天室的人名On UpdateCo nn ectio ns(CCmdUI* pCmdUI)On UpdateMessages(CCmdUI* pCmdUI) ProcessPendin gAccept()ProcessPe ndin gRead(CClie ntSocket* pSocket)ReadMsg(CClie ntSocket* pSocket)SendMsg(CCIientSocket* pSocket, CMessage*pMsg)Serialize(CArchive &ar)talk(int type2, CString from1, CString to1,CStri ng str1)UpdateClie nts()类名相关变量相关函数CServerView AssertValid() constCServerView()~CServerView()Dump(CDumpC on text &dc) const CServerDoc*CServerView::GetDocume nt() Message(LPCTSTRlpszMessage) Message1(LPCTSTR lpszMessage)On Draw(CDC* pDC)相关代码:void CAboutDlg::DoDataExcha nge(CDataExcha nge* pDX) {CDialog::DoDataExcha nge(pDX);//{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP} CCleanDlg::CCleanDlg(CWnd* pParent /*=NULL*/)ss-相关图标:: CDialog(CCleanDlg::IDD, pParent){//{{AFX_DATA_INIT(CCleanDlg) m_cleanname = _T("");//}}AFX_DATA_INIT}// CClientSocket ConstructionCClientSocket::CClientSocket(CServerDoc* pDoc){m_pDoc = pDoc; m_nMsgCount = 0; m_pFile = NULL;m_pArchiveIn = NULL; m_pArchiveOut = NULL;needdel=false;}/////////////////////////////////////////////////////////////////////////////// CClientSocket Operationsvoid CClientSocket::Init(){m_pFile = new CSocketFile(this);m_pArchiveIn = new CArchive(m_pFile,CArchive::load); m_pArchiveOut = newCArchive(m_pFile,CArchive::store);}void CClientSocket::Abort(){if (m_pArchiveOut != NULL){ m_pArchiveOut->Abort(); delete m_pArchiveOut; m_pArchiveOut = NULL;}}void CClientSocket::SendMsg(CMessage* pMsg){if (m_pArchiveOut != NULL){pMsg->Serialize(*m_pArchiveOut);m_pArchiveOut->Flush();}}void CClientSocket::ReceiveMsg(CMessage* pMsg){pMsg->Serialize(*m_pArchiveIn);}/////////////////////////////////////////////////////////////////////////////// CClientSocket Overridable callbacksvoid CClientSocket::OnReceive(int nErrorCode){CSocket::OnReceive(nErrorCode);m_pDoc->ProcessPendingRead(this);}BOOL CClientSocket::HasConnectionDropped( void ){BOOL bConnDropped = FALSE;INT iRet = 0;BOOL bOK = TRUE;struct timeval timeout = { 0, 0 };fd_set readSocketSet;FD_ZERO( &readSocketSet );FD_SET( m_hSocket, &readSocketSet );iRet = ::select( 0, &readSocketSet, NULL, NULL, &timeout );bOK = (iRet > 0);if(bOK){bOK = FD_ISSET( m_hSocket, &readSocketSet );}if( bOK ){CHAR szBuffer[1] = "";iRet = ::recv( m_hSocket, szBuffer, 1, MSG_PEEK ); bOK = ( iRet > 0 );if( !bOK ){INT iError = ::WSAGetLastError(); bConnDropped = ( ( iError == WSAENETRESET )|| ( iError == WSAECONNABORTED ) || ( iError == WSAECONNRESET ) || ( iError ==WSAEINVAL ) || ( iRet == 0 ) ); //Graceful disconnect from other side.}}return( bConnDropped );}/////////////////////////////////////////////////////////////////////////////// CSocket ImplementationCClientSocket::~CClientSocket(){if (m_pArchiveOut != NULL)delete m_pArchiveOut;if (m_pArchiveIn != NULL)delete m_pArchiveIn;if (m_pFile != NULL)delete m_pFile;}#ifdef _DEBUGvoid CClientSocket::AssertValid() const{CSocket::AssertValid();}void CClientSocket::Dump(CDumpContext& dc) const{CSocket::Dump(dc);}///////////////////////////////////////////////////////////////////////////// // CSocket ImplementationCListeningSocket::~CListeningSocket(){}#ifdef _DEBUGvoid CListeningSocket::AssertValid() const{CSocket::AssertValid();}void CListeningSocket::Dump(CDumpContext& dc) const{CSocket::Dump(dc);}LRESULT CMainFrame::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) {LRESULT result = CFrameWnd::WindowProc(message, wParam, lParam);if(wParam == SC_MINIMIZE){ShowWindow(SW_HIDE);}return result;}void CMainFrame::OnClose(){Shell_NotifyIcon(NIM_DELETE, &pnid);CFrameWnd::OnClose();}void CMainFrame::OnRestore(){}void CMainFrame::OnKickout(){CServerDoc* pDoc = (CServerDoc*)GetActiveDocument(); pDoc->Clean();}void CMessage::Serialize(CArchive &ar){if (ar.IsStoring()){ar <<type;ar <<(WORD)m_bClose;ar <<m_strText;ar <<(WORD)secret;ar <<from;ar <<to;ar <<(DWORD)color;ar <<image;}else{WORD wd;DWORD dwTmp;ar >>type;ar >>wd;m_bClose = (BOOL)wd;ar >>m_strText;ar >>wd;secret = (BOOL)wd;ar >>from;ar >>to;ar >>dwTmp;color = (COLORREF)dwTmp;ar >>image;}}void CServerDoc::UpdateList(CClientSocket* pSocket){CMessage* pMsg = new CMessage;for(POSITION pos = m_connectionList.GetHeadPosition(); pos != NULL;){CClientSocket* pSock = (CClientSocket*)m_connectionList.GetNext(pos); pMsg->from = pSock->name;pMsg->type = -8;pMsg->image = pSock->image;SendMsg(pSocket, pMsg);}}void CServerView::OnDraw(CDC* pDC){CServerDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);}四)系统调试服务器的是聊天系统中很重要的部分,这个界面设计较为简单,对客服端信息的发送时,问题接二连三的出现,很多都出现异常,主要是由于在定义语句不小心出现专业术语错误。
编号:计算机网络课程设计说明书题目:本地计算机网络信息管理系别:计算机科学与技术专业:计算机科学与技术学生姓名: xxx学号: ***********指导教师: xx2011年 3 月 18 日摘要本机网络信息管理器提供了有关计算机性能的信息,并显示了计算机上主要设备信息;如果连接到网络,那么还可以查看网络状态并迅速了解网络是如何工作的。
它的用户界面提供了设置网络信息的选项,其下还有具体的内容设置,而且这里可以查看到当前系统的CPU使用比率、内存等数据,默认设置下系统每隔两秒钟对数据进行1次自动更新。
目录1.绪论 (01)1.1 IP/TCP协议常识 (08)1.2 Socket的简介 (09)2.规划设计 (11)2.1 课题来源 (11)2.2 需求分析 (11)3.系统分析与设计方案 (12)3.1 聊天系统的总体设计要点 (12)3.2 聊天系统的设计步骤及功能模块划分 (12)3.3 功能模块结构图 (13)4.系统设计环境与测试 (26)4.1 开发环境和工具 (26)4.2 硬件环境 (26)4.3 聊天系统的测试 (26)5.课程设计总结 (28)5.1 课程设计总结 (28)5.2 经验和感想 (28)参考文献 (31)1绪论随着互联网逐步普及,人们的生活和工作也越来越离不开信息网络的支持,而聊天室是人们最常见,最直接的网上交流的方式。
本信息管理系统以网络设置为主,为广大用户提供一个简洁的、方便的网络设置方式,也是使网络设置更简单,更适用于对电脑了解不多的用户。
本文所介绍的网络信息管理系统是基于开放的C#应用程序开发设计的,其主要特性是能动态、实时的完成信息的传递,且具有高效的交互性,更有效的反映本机的网络设置状况,易于维护和更新,其运行所需环境及其工作流程和各个功能控件的工作原理将在本文依次介绍,并且文中提供了部分程序源代码。
1.1 IP/TCP协议常识(1)IP、TCP协议的特点:TCP/IP(Transmission Control Protocol/Internet Protocol)是传输控制协议/网际协议的缩写, TCP/IP是当今网络互联的核心协议。
课程设计报告课程名称:面向对象程序设计C++设计题目:简易聊天程序设计专业:计算机科学与技术姓名:金文学号:指导教师:李晓虹2015 年 1 月 10 日(一)系统需求分析用户角度考察系统应具有哪些功能及非功能性需求。
能实现用户注册、用户的登录、各客户端能连接起来,服务器能与客户端相连实现用户之间信息的发送与共享。
(二)总体设计1、初始化socket,创建服务器端2、维护一个链表,保存所有用户的IP地址、端口信息3、接受用户传送来的聊天信息,然后向链表中的所用用户转发4、接受用户传送来的连接判断命令,并向用户发出相应命令根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
建立服务器显示本机IP地址建立连接在另一台机器上运行聊天程序输入服务器IP地址输入名字建立聊天提示连接成功或失败进行聊天清除聊天内容断开连接退出提示连接成功进行聊天退出清除聊天关闭服务器提示有某个服务器正在连接,是否连接(三)详细设计ChatClient:运行界面:连接服务器:IDD_SENDDLG :重要代码:void CChatClientDoc::talk(int type, CString form, CString to,CString str, COLORREF clr){CChatClientView* pView = (CChatClientView*)GetView();if(form != m_strHandle && to != m_strHandle && m_bFilter) return;CString temp,to2,first,second;if(type > 32 || type < 0)return;temp.LoadString(IDS_TALK0 + type);int i=temp.Find(",");if(i != -1){first = temp.Left(i);if(i != temp.GetLength() - 1){second = temp.Mid(i + 1);second += ":";}else{second=":";}pView->TextOut((LPCTSTR)form, RGB(0,0,255));pView->TextOut((LPCTSTR)first, RGB(0,0,0));pView->TextOut((LPCTSTR)to, RGB(0,0,255));pView->TextOut((LPCTSTR)second, RGB(0,0,0));pView->TextOut((LPCTSTR)str,clr);pView->TextOut((LPCTSTR)"\r\n",clr);}else{first=temp;second=":";pView->TextOut(form,RGB(0,0,255));pView->TextOut(first,RGB(0,0,0));pView->TextOut(second,RGB(0,0,0));pView->TextOut(str,clr);pView->TextOut("\r\n",clr);}}void CChatClientDoc::Disconnect(){msg.type = -2;msg.m_bClose = TRUE;msg.from = m_strHandle;msg.to = "所有人";msg.secret = FALSE;msg.m_strText ="Hello";msg.color = RGB(0,136,255);SendMsg();m_bConnected = FALSE;msg.from = "DUMP";GetView()->GetParent()->SendMessage(WM_ADDLIST + 1, (LPARAM)&(msg.from), msg.image);}void CChatClientView::TextOut(LPCTSTR lpszMessage, COLORREF clr){cfm.cbSize=sizeof(cfm); // CHARFORMAT cfmcfm.crTextColor=clr;cfm.dwMask=CFM_COLOR;CString strTemp = lpszMessage;int len = GetWindowTextLength();GetRichEditCtrl().SetSel(len,len);GetRichEditCtrl().SetSelectionCharFormat(cfm);GetRichEditCtrl().ReplaceSel(strTemp);}void CChatSocket::OnReceive(int nErrorCode){CSocket::OnReceive(nErrorCode);m_pDoc->ProcessPendingRead();}void CChatClientCntrItem::Dump(CDumpContext& dc) const{CRichEditCntrItem::Dump(dc);}void CLogin::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CLogin)DDX_CBString(pDX, IDC_IMAGE, m_strImage);DDX_CBString(pDX, IDC_NAME, m_strName);DDX_Text(pDX, IDC_SERVER, m_strServerIP);//}}AFX_DATA_MAP}BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) {if( !CFrameWnd::PreCreateWindow(cs) )return FALSE;cs.style &= ~WS_MAXIMIZEBOX;cs.style &= ~WS_SIZEBOX;cs.cx = 640;cs.cy = 480;return TRUE;}CMessage::CMessage(){image = 6;type = 0;secret = FALSE;color = RGB(0,136,255);m_bClose = FALSE;from = to = m_strText = _T("");}CMessage::~CMessage(){}void CMessage::Serialize(CArchive &ar){if (ar.IsStoring()){ar << type;ar << (WORD)m_bClose;ar << m_strText;ar << (WORD)secret;ar << from;如有帮助,欢迎下载。
课程设计聊天程序一、教学目标本课程的学习目标包括以下三个方面:1.知识目标:学生需要掌握聊天程序的基本原理和关键技术,包括自然语言处理、对话管理、语音识别等。
2.技能目标:学生能够运用所学知识设计和开发一个简单的聊天程序,具备解决实际问题的能力。
3.情感态度价值观目标:学生通过本课程的学习,培养对技术的兴趣和好奇心,增强对科学研究的热情和责任感。
在制定教学目标时,考虑了课程性质、学生特点和教学要求。
课程目标具体、可衡量,以便学生和教师能够清晰地了解课程的预期成果。
二、教学内容根据课程目标,教学内容主要包括以下几个部分:1.聊天程序的基本原理:介绍聊天程序的定义、发展历程和应用场景。
2.关键技术:讲解自然语言处理、对话管理、语音识别等关键技术的基础知识。
3.聊天程序的设计与开发:指导学生运用所学知识设计和开发一个简单的聊天程序。
4.实践案例:分析国内外优秀的聊天程序案例,让学生了解聊天程序的实际应用。
教学内容安排合理,注重理论与实践相结合,确保学生能够掌握聊天程序的相关知识和技能。
三、教学方法本课程采用多种教学方法,以激发学生的学习兴趣和主动性:1.讲授法:讲解聊天程序的基本原理和关键技术。
2.讨论法:学生讨论聊天程序的设计与开发,促进学生思考和交流。
3.案例分析法:分析优秀聊天程序案例,让学生了解实际应用。
4.实验法:指导学生动手设计和开发聊天程序,提高实践能力。
教学方法多样化,有助于提高学生的学习效果。
四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将采用以下教学资源:1.教材:选用国内外优秀的聊天程序相关教材,为学生提供系统性的知识学习。
2.参考书:推荐相关的参考书籍,拓展学生的知识视野。
3.多媒体资料:利用视频、课件等多媒体资源,生动展示聊天程序的相关知识。
4.实验设备:提供必要的实验设备,让学生能够顺利进行聊天程序的开发实践。
教学资源丰富多样,有助于提高教学质量。
五、教学评估为了全面、客观、公正地评估学生的学习成果,本课程采用以下评估方式:1.平时表现:关注学生在课堂上的参与度、提问回答等情况,给予及时的反馈和鼓励。
课程设计报告课程名称:面向对象程序设计C++设计题目:简易聊天程序设计专业:计算机科学与技术姓名:金文学号:指导教师:李晓虹2015 年 1 月 10 日(一)系统需求分析用户角度考察系统应具有哪些功能及非功能性需求。
能实现用户注册、用户的登录、各客户端能连接起来,服务器能与客户端相连实现用户之间信息的发送与共享。
(二)总体设计1、初始化socket,创建服务器端2、维护一个链表,保存所有用户的IP地址、端口信息3、接受用户传送来的聊天信息,然后向链表中的所用用户转发4、接受用户传送来的连接判断命令,并向用户发出相应命令根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
建立服务器显示本机IP地址建立连接在另一台机器上运行聊天程序输入服务器IP地址输入名字建立聊天提示连接成功或失败进行聊天清除聊天内容断开连接退出提示连接成功进行聊天退出清除聊天关闭服务器提示有某个服务器正在连接,是否连接(三)详细设计ChatClient:运行界面:连接服务器:IDD_SENDDLG :重要代码:void CChatClientDoc::talk(int type, CString form, CString to,CString str, COLORREF clr){CChatClientView* pView = (CChatClientView*)GetView();if(form != m_strHandle && to != m_strHandle && m_bFilter) return;CString temp,to2,first,second;if(type > 32 || type < 0)return;temp.LoadString(IDS_TALK0 + type);int i=temp.Find(",");if(i != -1){first = temp.Left(i);if(i != temp.GetLength() - 1){second = temp.Mid(i + 1);second += ":";}else{second=":";}pView->TextOut((LPCTSTR)form, RGB(0,0,255));pView->TextOut((LPCTSTR)first, RGB(0,0,0));pView->TextOut((LPCTSTR)to, RGB(0,0,255));pView->TextOut((LPCTSTR)second, RGB(0,0,0));pView->TextOut((LPCTSTR)str,clr);pView->TextOut((LPCTSTR)"\r\n",clr);}else{first=temp;second=":";pView->TextOut(form,RGB(0,0,255));pView->TextOut(first,RGB(0,0,0));pView->TextOut(second,RGB(0,0,0));pView->TextOut(str,clr);pView->TextOut("\r\n",clr);}}void CChatClientDoc::Disconnect(){msg.type = -2;msg.m_bClose = TRUE;msg.from = m_strHandle;msg.to = "所有人";msg.secret = FALSE;msg.m_strText ="Hello";msg.color = RGB(0,136,255);SendMsg();m_bConnected = FALSE;msg.from = "DUMP";GetView()->GetParent()->SendMessage(WM_ADDLIST + 1, (LPARAM)&(msg.from), msg.image);}void CChatClientView::TextOut(LPCTSTR lpszMessage, COLORREF clr){cfm.cbSize=sizeof(cfm); // CHARFORMAT cfmcfm.crTextColor=clr;cfm.dwMask=CFM_COLOR;CString strTemp = lpszMessage;int len = GetWindowTextLength();GetRichEditCtrl().SetSel(len,len);GetRichEditCtrl().SetSelectionCharFormat(cfm);GetRichEditCtrl().ReplaceSel(strTemp);}void CChatSocket::OnReceive(int nErrorCode){CSocket::OnReceive(nErrorCode);m_pDoc->ProcessPendingRead();}void CChatClientCntrItem::Dump(CDumpContext& dc) const{CRichEditCntrItem::Dump(dc);}void CLogin::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CLogin)DDX_CBString(pDX, IDC_IMAGE, m_strImage);DDX_CBString(pDX, IDC_NAME, m_strName);DDX_Text(pDX, IDC_SERVER, m_strServerIP);//}}AFX_DATA_MAP}BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) {if( !CFrameWnd::PreCreateWindow(cs) )return FALSE;cs.style &= ~WS_MAXIMIZEBOX;cs.style &= ~WS_SIZEBOX;cs.cx = 640;cs.cy = 480;return TRUE;}CMessage::CMessage(){image = 6;type = 0;secret = FALSE;color = RGB(0,136,255);m_bClose = FALSE;from = to = m_strText = _T("");}CMessage::~CMessage(){}void CMessage::Serialize(CArchive &ar){if (ar.IsStoring()){ar << type;ar << (WORD)m_bClose;ar << m_strText;ar << (WORD)secret;ar << from;如有帮助,欢迎下载。
ar << to;ar << (DWORD)color;ar << image;}else{WORD wd;DWORD dwTmp;ar >> type;ar >> wd;m_bClose = (BOOL)wd;ar >> m_strText;ar >> wd;secret = (BOOL)wd;ar >> from;ar >> to;ar >> dwTmp;color = (COLORREF)dwTmp;ar >> image;}/*m_msgList.Serialize(ar);fromlist.Serialize(ar);tolist.Serialize(ar);seclist.Serialize(ar);typelist.Serialize(ar);clrlist.Serialize(ar);*/}void CMessage::Reset(){image = 6;type = 0;secret = FALSE;color = RGB(0,136,255);m_bClose = FALSE;from = to = m_strText = _T("");/* m_msgList.RemoveAll();fromlist.RemoveAll();tolist.RemoveAll();seclist.RemoveAll();clrlist.RemoveAll();typelist.RemoveAll();*/}int COnlineBar::OnCreate(LPCREATESTRUCT lpCreateStruct){if (CDialogBar::OnCreate(lpCreateStruct) == -1)return -1;CRect rect;GetClientRect(&rect);rect.left += 8;rect.top += 15;rect.right -= 8;rect.bottom -= 8;m_ListCtrl = new COnlineList;if (!m_ListCtrl->Create(WS_CHILD | WS_VISIBLE | LVS_REPORT, rect, this, IDC_LISTBOX)){TRACE0("Failed to create view for CMyBarLeft\n");return -1;}m_ListCtrl->ModifyStyleEx(0, WS_EX_CLIENTEDGE);AddExStyle(LVS_EX_FULLROWSELECT | LVS_OWNERDRAWFIXED);int i;LV_COLUMN lvc;lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;CString strTemp[2] = {"名称", "IP"};int size[2] = {140,40};for(i = 0; i < 2; i++){lvc.iSubItem = i;lvc.pszText = (char*)(LPCTSTR)strTemp[i];lvc.cx = size[i];lvc.fmt = LVCFMT_LEFT;m_ListCtrl->InsertColumn(i, &lvc);}return 0;}void COnlineBar::AddExStyle(DWORD dwNewStyle){DWORD dwStyle = ::SendMessage (m_ListCtrl->m_hWnd, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0);dwStyle |= dwNewStyle;::SendMessage (m_ListCtrl->m_hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, dwStyle);}int COnlineList::OnCreate(LPCREATESTRUCT lpCreateStruct){if (CListCtrl::OnCreate(lpCreateStruct) == -1)return -1;m_imgList.Create(IDB_IMAGE, 16, 1, RGB(0, 255, 0));HIMAGELIST him = m_imgList.m_hImageList;::SendMessage(this->m_hWnd,LVM_SETIMAGELIST,(WPARAM)LVSIL_SMALL,(LPARAM )him);//::SendMessage(this->m_hWnd,LVM_SETIMAGELIST,(WPARAM)LVSIL_NORMAL,(LPAR AM)him);ImageList_SetBkColor(him,CLR_NONE);return 0;}void COnlineList::AddItem(short i, char* name, char* text){LVITEM lvi;lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;lvi.iItem = GetItemCount();lvi.iImage = i;lvi.iSubItem = 0;lvi.pszText = name;hTextMax = 64;lvi.lParam = 0;InsertItem(&lvi);lvi.mask = LVIF_TEXT;lvi.pszText = text;hTextMax = 32;lvi.iSubItem = 1;SetItem(&lvi);}void COnlineList::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult){NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;CString str;int iSel = pNMListView->iItem;if (iSel >= 0 ){str = GetItemText(iSel,0);CWnd* pParentWnd = GetParent();while (pParentWnd != NULL){if (pParentWnd->IsFrameWnd()){break;}pParentWnd = pParentWnd->GetParent();}if (pParentWnd != NULL)pParentWnd->SendMessage(WM_DBCLICKITEM, 0, (LPARAM)&str);}*pResult = 0;}void COnlineList::Remove(char *name){CString str;for(int i = 0; i < GetItemCount(); i++){str = GetItemText(i,0);if(strcmp(str, name) == 0){DeleteItem(i);break;}}}Charsrvr:菜单设计(IDR_MAINFRAME)对话框设计:IDD_ABOUTBOXIDD_CLEANSB:相关图标:相关代码:void CAboutDlg::DoDataExchange(CDataExchange* pDX) {CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CAboutDlg)//}}AFX_DATA_MAP}CCleanDlg::CCleanDlg(CWnd* pParent /*=NULL*/): CDialog(CCleanDlg::IDD, pParent){//{{AFX_DATA_INIT(CCleanDlg)m_cleanname = _T("");//}}AFX_DATA_INIT}// CClientSocket ConstructionCClientSocket::CClientSocket(CServerDoc* pDoc){m_pDoc = pDoc;m_nMsgCount = 0;m_pFile = NULL;m_pArchiveIn = NULL;m_pArchiveOut = NULL;needdel=false;}///////////////////////////////////////////////////////////////////////////// // CClientSocket Operationsvoid CClientSocket::Init(){m_pFile = new CSocketFile(this);m_pArchiveIn = new CArchive(m_pFile,CArchive::load);m_pArchiveOut = new CArchive(m_pFile,CArchive::store);}void CClientSocket::Abort(){if (m_pArchiveOut != NULL){m_pArchiveOut->Abort();delete m_pArchiveOut;m_pArchiveOut = NULL;}}void CClientSocket::SendMsg(CMessage* pMsg){if (m_pArchiveOut != NULL){pMsg->Serialize(*m_pArchiveOut);m_pArchiveOut->Flush();}}void CClientSocket::ReceiveMsg(CMessage* pMsg){pMsg->Serialize(*m_pArchiveIn);}///////////////////////////////////////////////////////////////////////////// // CClientSocket Overridable callbacksvoid CClientSocket::OnReceive(int nErrorCode){CSocket::OnReceive(nErrorCode);m_pDoc->ProcessPendingRead(this);}BOOL CClientSocket::HasConnectionDropped( void ){BOOL bConnDropped = FALSE;INT iRet = 0;BOOL bOK = TRUE;struct timeval timeout = { 0, 0 };fd_set readSocketSet;FD_ZERO( &readSocketSet );FD_SET( m_hSocket, &readSocketSet );iRet = ::select( 0, &readSocketSet, NULL, NULL, &timeout );bOK = (iRet > 0);if(bOK){bOK = FD_ISSET( m_hSocket, &readSocketSet );}if( bOK ){CHAR szBuffer[1] = "";iRet = ::recv( m_hSocket, szBuffer, 1, MSG_PEEK );bOK = ( iRet > 0 );if( !bOK ){INT iError = ::WSAGetLastError();bConnDropped = ( ( iError == WSAENETRESET ) ||( iError == WSAECONNABORTED ) ||( iError == WSAECONNRESET ) ||( iError == WSAEINVAL ) ||( iRet == 0 ) ); //Graceful disconnect from other side.}}return( bConnDropped );}///////////////////////////////////////////////////////////////////////////// // CSocket ImplementationCClientSocket::~CClientSocket(){if (m_pArchiveOut != NULL)delete m_pArchiveOut;if (m_pArchiveIn != NULL)delete m_pArchiveIn;if (m_pFile != NULL)delete m_pFile;}#ifdef _DEBUGvoid CClientSocket::AssertValid() const{CSocket::AssertValid();}void CClientSocket::Dump(CDumpContext& dc) const{CSocket::Dump(dc);}///////////////////////////////////////////////////////////////////////////// // CSocket ImplementationCListeningSocket::~CListeningSocket(){}#ifdef _DEBUGvoid CListeningSocket::AssertValid() const{CSocket::AssertValid();}void CListeningSocket::Dump(CDumpContext& dc) const{CSocket::Dump(dc);}LRESULT CMainFrame::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) {LRESULT result = CFrameWnd::WindowProc(message, wParam, lParam);if(wParam == SC_MINIMIZE){ShowWindow(SW_HIDE);}return result;}void CMainFrame::OnClose(){Shell_NotifyIcon(NIM_DELETE, &pnid);CFrameWnd::OnClose();}void CMainFrame::OnRestore(){}void CMainFrame::OnKickout(){CServerDoc* pDoc = (CServerDoc*)GetActiveDocument();pDoc->Clean();}void CMessage::Serialize(CArchive &ar){if (ar.IsStoring()){ar << type;ar << (WORD)m_bClose;ar << m_strText;ar << (WORD)secret;ar << from;ar << to;ar << (DWORD)color;ar << image;}else{WORD wd;DWORD dwTmp;ar >> type;ar >> wd;m_bClose = (BOOL)wd;ar >> m_strText;ar >> wd;secret = (BOOL)wd;ar >> from;ar >> to;ar >> dwTmp;color = (COLORREF)dwTmp;ar >> image;}}void CServerDoc::UpdateList(CClientSocket* pSocket){CMessage* pMsg = new CMessage;for(POSITION pos = m_connectionList.GetHeadPosition(); pos != NULL;){ CClientSocket* pSock = (CClientSocket*)m_connectionList.GetNext(pos);pMsg->from = pSock->name;pMsg->type = -8;pMsg->image = pSock->image;SendMsg(pSocket, pMsg);}}void CServerView::OnDraw(CDC* pDC){CServerDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);}(四)系统调试服务器的是聊天系统中很重要的部分,这个界面设计较为简单,对客服端信息的发送时,问题接二连三的出现,很多都出现异常,主要是由于在定义语句不小心出现专业术语错误。