您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 经营企划 > 基于Socket的即时通讯系统
《综合课程设计》设计报告论文题目:基于Socket的即时通讯系统学院(系):电子信息与自动化学院电子信息工程系班级:学生姓名:学号指导教师:时间:2011年6月7日到2011年6月17日评阅教师评语:课程设计成绩考勤成绩实做成绩报告成绩总评成绩指导教师签名:一、设计目的:通过综合课程设计,使学生能够运用《数字信号处理》、《信号与系统》、《通信原理》、《面向对象的程序设计》、《计算机通信网》、《通信协议开发及应用》等课程的知识来设计一个基于Socket的即时通讯系统,培养学生的动手能力以及分析问题、解决问题的能力。二、设计内容:1.利用Socket通信机制实现一种即时通信系统。2.系统分为服务端和客户端两部分:2.1客户端向服务器注册自己的信息,包括IP地址、端口号、用户名等;2.2客户端启动后向服务器查询其它用户在线状态,包括用户名、IP地址、端口号等;2.3客户端之间建立直接连接,实现一对一的信息交换;2.4服务器端维护用户的状态信息,对用户查询做出响应;三、设计要求:1基本要求:(1)熟练掌握面向对象的程序设计方法;(2)实现点对点通讯,能进行文字对话传输,包括客户端与服务器;(3)能对系统参数进行配置。2提高要求:(1)实现文件、图片传输;(2)语音对话(两人及两人以上);(3)友好的对话界面四、设计原理:服务器:服务器端主要完成监听和接收用户的连接请求,以及管理用户之间的通信和用户的状态,比如登陆和退出聊天室。服务器端在启动时先建立一个SOCKET用以监听客户端的连接请求,由客户连接时新建一个SOCKET来进行与用户之间的数据传输,本程序定义了一个大小为20的SOCKET数组用来作于用户的连接,所以本程序同时最多可以有20人在同一聊天室中聊天。客户退出聊天室时释放该用户占有的SOCKET,使之可以供其它用户使用。客户端:客户端主要是客户之间用来法聊天的,客户端启动后首先建立一个SOCKET根据客户输入的服务器的地址和用户名,向服务器发出连接请求,连接成功后就可以用同一个SOCKET用作数据传输,退出聊天室时关闭该SOCKET。五、操作界面与演示:打开程序然后启动服务端:登陆服务器,填写服务器IP和用户名。程序演示结束。六、源程序清单:1//聊天程序.h:mainheaderfileforthe聊天程序application//#if!defined(AFX__H__C85C7F64_AD5B_11D2_800F_5254AB250EAA__INCLUDED_)#defineAFX__H__C85C7F64_AD5B_11D2_800F_5254AB250EAA__INCLUDED_#if_MSC_VER1000#pragmaonce#endif//_MSC_VER1000#ifndef__AFXWIN_H__#errorinclude'stdafx.h'beforeincludingthisfileforPCH#endif#includeresource.h//mainsymbols///////////////////////////////////////////////////////////////////////////////CMyApp://See聊天程序.cppfortheimplementationofthisclass//classCMyApp:publicCWinApp{public:CMyApp();//Overrides//ClassWizardgeneratedvirtualfunctionoverrides//{{AFX_VIRTUAL(CMyApp)public:virtualBOOLInitInstance();//}}AFX_VIRTUAL//Implementation//{{AFX_MSG(CMyApp)//NOTE-theClassWizardwilladdandremovememberfunctionshere.//DONOTEDITwhatyouseeintheseblocksofgeneratedcode!//}}AFX_MSGDECLARE_MESSAGE_MAP()}///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCATION}}//MicrosoftVisualC++willinsertadditionaldeclarationsimmediatelybeforethepreviousline.#endif//!defined(AFX__H__C85C7F64_AD5B_11D2_800F_5254AB250EAA__INCLUDED_)2.voidworkingSock::OnReceive(intnErrorCode){//TODO:Addyourspecializedcodehereand/orcallthebaseclass//AfxMessageBox(receiving,MB_OK);recvNum=0;recvNum=Receive(recvBuf,4096);//,MSG_PEEK);if(recvNum!=0){CWinApp*thisApp;//获得进程的句柄thisApp=AfxGetApp();CMyDlg*dialWnd;//获得对话框的句柄dialWnd=(CMyDlg*)thisApp-GetMainWnd();CListBox*allMes;allMes=(CListBox*)dialWnd-GetDlgItem(IDC_LIST1);//获得listbox句柄recvBuf[recvNum]='\0';allMes-AddString(recvBuf);//将接收到的消息显示在LISTBOX中allMes-UpdateData(FALSE);memset(recvBuf,0,4096);//置0}/*intlength;length=dialWnd-m_listAll.GetLength();//从后面插入recvBuf[recvNum]='\0';//使之成为字符串dialWnd-m_listAll.Insert(length,recvBuf);*/AsyncSelect(FD_READ);CAsyncSocket::OnReceive(nErrorCode);}voidworkingSock::OnSend(intnErrorCode){//TODO:Addyourspecializedcodehereand/orcallthebaseclassCWinApp*thisApp;//获得进程的句柄thisApp=AfxGetApp();CMyDlg*dialWnd;//获得对话框的句柄dialWnd=(CMyDlg*)thisApp-GetMainWnd();//AfxMessageBox(SENDING,MB_OK);if(dialWnd-m_message!=){intlength;length=dialWnd-m_message.GetLength();memcpy(recvBuf,dialWnd-m_message.GetBuffer(length),length);dialWnd-m_message.ReleaseBuffer();Send(recvBuf,length,0);}dialWnd-m_message=;dialWnd-UpdateData(FALSE);AsyncSelect(FD_READ);CAsyncSocket::OnSend(nErrorCode);}voidworkingSock::OnConnect(intnErrorCode){//TODO:Addyourspecializedcodehereand/orcallthebaseclassthis-AsyncSelect(FD_READ);//AfxMessageBox(client:ConnectionisOK,MB_OK);{CWinApp*thisApp;//获得进程的句柄thisApp=AfxGetApp();CMyDlg*dialWnd;//获得对话框的句柄dialWnd=(CMyDlg*)thisApp-GetMainWnd();CWnd*sendBut,*mesEdit;sendBut=dialWnd-GetDlgItem(IDC_BUTTON3);mesEdit=dialWnd-GetDlgItem(IDC_EDIT3);sendBut-EnableWindow(TRUE);mesEdit-EnableWindow(TRUE);//使可以输入信息}CAsyncSocket::OnConnect(nErrorCode);}3.HCURSORCMyDlg::OnQueryDragIcon(){return(HCURSOR)m_hIcon;}voidCMyDlg::OnListen(){//TODO:AddyourcontrolnotificationhandlercodehereNowPCis=0;//server//初始化serverSOCKET类//in_addraddLocal;//addLocal.S_un.S_addr=htonl(INADDR_ANY);//本地IP地址,把整形的INADDR_ANY变换成字符串BOOLFlag=ServerListenSock.Create(5150,SOCK_STREAM,FD_ACCEPT);//,inet_ntoa(addLocal));if(!Flag){//createfailureAfxMessageBox(SocketError!);ServerListenSock.Close();PostQuitMessage(0);return;}if(!ServerListenSock.Listen(1))//listen{//listenfailureAfxMessageBox(SocketError!);ServerListenSock.Close();PostQuitMessage(0);return;}//AfxMessageBox(listenisok,MB_OK);m_connect.EnableWindow(FALSE);m_listen.EnableWindow(FALSE);CWnd*edit1;edit1=GetDlgItem(IDC_EDIT1);edit1-EnableWindow(FALSE);}voidCMyDlg::OnConnect(){//TODO:AddyourcontrolnotificationhandlercodehereUpdateData(TRUE);if(m_ip!=){NowPCis=1;//client//interestedinconnectisokmessage//AfxMessageBox(m_ip,MB_OK);ClientSock.Create(5151,SOCK_STREAM,FD_CONNECT);//|FD_READ|FD_WRITE);ClientSock.Connect(m_ip,5150);m_listen.EnableWindow(FALSE);m_connect.EnableWindow(FALSE);CWnd*edit1;edit1=GetDlgItem(IDC_EDIT1);edit1-EnableWindow(FALSE);}}voidCMyDlg::OnSend(){UpdateData(TRUE);//getdatafromcontrol//TODO:Addyourcontrolnotificationhandlercodehereif(m_message!=){if(NowPCis==0)//i
本文标题:基于Socket的即时通讯系统
链接地址:https://www.777doc.com/doc-7182569 .html