c课程设计——聊天程序实验报告.doc_第1页
c课程设计——聊天程序实验报告.doc_第2页
c课程设计——聊天程序实验报告.doc_第3页
c课程设计——聊天程序实验报告.doc_第4页
c课程设计——聊天程序实验报告.doc_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

- 23 -23青岛理工大学C+面向对象课程设计报告院(系): 计算机工程学院 专业: 计算机科学与技术 学生姓名: 张义华 班级:113学号: 201107104 题目: 局域网聊天程序 起迄日期: 2013.6.232013.7.5 设计地点: 计算机学院机房 指 导 教 师: 李兰 完成日期: 2013 年7月 5目录一、需求分析-31.1 客户端1.2 服务端二、设计内容-42.1程序整体构建逻辑图2.2 基于UDP的客户端和服务端的连接逻辑图2.3各模块代码实现三、 调试分析-103.1实际完成的情况说明3.2程序的性能分析和上机过程中出现的问题及其解决方案3.3程序中可以改进的地方说明四、 用户手册-11五、 设计总结-13六、 参考文献-13七、 附录-14一、需求分析这次开发的局域网聊天工具目标在于在局域网环境下能够简单的实现人与人的即时通讯,要求收发信息速度快、安全性高和精准性高。本软件基于visual c+ 6.0环境下开发,并采用MFC进行处理,界面具有基本的功能按钮,于此本人还添加了一个查询本地的主机名和IP地址的功能。同时,本软件包含有客户端和服务端,他们之间是基于UDP协议下进行通信的,他们具备的功能如下:1.1 客户端 点击查询按钮获取本地主机名和IP 获取远程服务端端口 输入远程服务端IP并连接 用户能够自定义编辑发送信息并点击发送按钮发送 用户能够接收到来自远程服务端的信息 用户右键点击窗口可以查询软件版本 自动建立一个文件存储聊天记录1.2 服务端 点击查询按钮获取本地主机名和IP 获取远程客户端端口 输入远程客户端IP并连接 用户能够自定义编辑发送信息并点击发送按钮发送 用户能够接收到来自远程客户端的信息 用户右键点击窗口可以查询软件版本 自动建立一个文件存储聊天记录二、设计内容2.1程序整体构建逻辑图:按需求建立对话框在CCHATDlg类中添加新成员函数添加RECVPARAM结构体struct RECVPARAMSOCKET sock;HWND hwnd;InitSocket()RecvProc(LPVOID IpParameter)OnBUTTONsearch()OnBtnSend()OnRecvData(WPARAM wParam,LPARAM IParam)Record(CString recordString)实现各成员函数初始化套接字消息处理函数查询本地主机名和IP发送消息接收消息聊天记录函数2.2 基于UDP的客户端和服务端的连接逻辑图Socket()服务端Bind()recvfrom()Close()Socket()客户端Sendto()Recvfrom()Close()Sendto()基于UDP的套接字编程,对于接收端(服务端)来说,它必须先启动以接收客户端发送的数据,因此接收端必须告诉主机它是在哪个地址和端口上等待数据的到来,也就是说,接收端(服务端)必须调用bind()函数将套接字绑定到一个本地地址和端口上。2.3各模块代码实现1)、/初始化套接字BOOL CCHATDlg:InitSocket()m_socket=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);if(m_socket=INVALID_SOCKET)MessageBox(套接字创建失败!);return FALSE;SOCKADDR_INServerAddr;ServerAddr.sin_family=AF_INET;ServerAddr.sin_port= htons(6000);ServerAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); int retval;retval=bind(m_socket,(SOCKADDR*)&ServerAddr,sizeof(SOCKADDR);if(retval=SOCKET_ERROR)closesocket(m_socket);MessageBox(绑定失败!);return FALSE;return TRUE;2)、/消息处理函数,注意在声明时应该为staticDWORD WINAPI CCHATDlg:RecvProc(LPVOID lpParameter)SOCKET sock=(RECVPARAM*)lpParameter)-sock;HWND hwnd=(RECVPARAM*)lpParameter)-hwnd;SOCKADDR_IN ClientAddr;int len=sizeof(SOCKADDR);char recvBuf512;char tempBuf512;int retval;while(1)retval=recvfrom(sock,recvBuf,512,0,(SOCKADDR*)&ClientAddr,&len);if(retval=SOCKET_ERROR)break;sprintf(tempBuf,(%s): %s,inet_ntoa(ClientAddr.sin_addr),recvBuf);:PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)tempBuf);return 0;3)、同时,在BOOL CCHATDlg:OnInitDialog()添加如下代码:InitSocket();/套接字初始化RECVPARAM *pRecvParam=new RECVPARAM;pRecvParam-sock=m_socket;pRecvParam-hwnd=m_hWnd;HANDLE hThread=CreateThread(NULL,0,RecvProc,(LPVOID)pRecvParam,0,NULL);CloseHandle(hThread);4)、定义一个全局静态变量CString NewString 用于进行格式输出和记录聊天消息/发送数据void CCHATDlg:OnBtnSend() /TODO: Add your control notification handler code herDWORD dwIP;(CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1)-GetAddress(dwIP);SOCKADDR_IN ClientAddr;ClientAddr.sin_family=AF_INET;ClientAddr.sin_port= htons(5150);ClientAddr.sin_addr.S_un.S_addr = htonl(dwIP);CString strSend;CString strTime;GetDlgItemText(IDC_EDIT_SEND,strSend);if(strSend.GetLength()=0)MessageBox(发送的消息不能为空!);elsesendto(m_socket,strSend,strSend.GetLength()+1,0,(SOCKADDR*)&ClientAddr,sizeof(SOCKADDR);SetDlgItemText(IDC_EDIT_SEND,);/聊天消息时间记录CTime tm;tm=CTime:GetCurrentTime();strTime=tm.Format(%Y-%m-%d %X);strSend=strSend+【;strSend+=strTime;strSend=strSend+】;strSend+=rn;NewString+=rn;NewString+=我: ;NewString+=strSend;Record(NewString);/调用消息记录函数SetDlgItemText(IDC_EDIT_RECV,NewString);/回显在本地聊天窗口5)、/接收数据void CCHATDlg:OnRecvData(WPARAM wParam,LPARAM lParam)CString str=(char*)lParam;CString strTime;GetDlgItemText(IDC_EDIT_RECV,NewString);/聊天消息时间记录CTime tm;tm=CTime:GetCurrentTime();strTime=tm.Format(%Y-%m-%d %X);str=str+【;str+=strTime;str=str+】;str+=rn;NewString+=rn;NewString+=str;SetDlgItemText(IDC_EDIT_RECV,NewString);Record(NewString);/调用消息记录函数6)、附加查询本地主机名和IP功能void CCHATDlg:OnBUTTONsearch()/查询按钮WSADATA wsaData;WSAStartup(MAKEWORD(1,1),&wsaData);char szHostName128;if(gethostname(szHostName,128)=0)/获取主机名m_HostName.SetWindowText(szHostName);hostent* ent=gethostbyname(szHostName);/获取主机信息for(int i=0;ent!=NULL & ent-h_addr_listi!=NULL;i+)LPCTSTR IpAddr=inet_ntoa(*(in_addr*)ent-h_addr_listi);/转换成点分十进制格式m_IPAddr.AddString(IpAddr);WSACleanup();7)、聊天记录int CCHATDlg:Record(CString recordString)/消息记录函数CFile recordFile(TheRecords.txt,CFile:modeCreate|CFile:modeWrite);/定义文件对象recordFile.Write(recordString,strlen(recordString);recordFile.Close();return 0;8)、在CHATDlg.h文件添加宏:#define WM_RECVDATAWM_USER+1三、调试分析1、 实际完成的情况说明:本软件目前完成了基本功能需求,服务端和客户端可以进行简单的文本消息通信,两端皆可查询本地的主机名和IP,同时可以存储聊天记录。在后期完善过程中,对软件界面和文本输出格式都进行了调整,还增添了之前忽略的“获取当前聊天时间”这一功能。2、 程序的性能分析和上机过程中出现的问题及其解决方案:本软件目前运行稳定,可以说达到之前的期望;不仅收发消息快速,而且精准度也很高。在调试过程中,开始出现的问题是:两端能够正常进行通信,但是比如当你在客户端编辑一段消息并要发送时,服务端能够正常接收,但是在客户端的聊天记录区没有回显刚才要发送的消息;后来我就定义了一个全局静态量CString NewString来进行调整当在OnBtnSend函数里编辑发送信息的时候就要以一定的格式加到NewString中去并用SetDlgItemText(IDC_EDIT_RECV,NewString)函数对其进行显示,同时在OnRecvData函数中接收到来着远程的消息的时候也同样以一定格式添加到NewString中并用SetDlgItemText(IDC_EDIT_RECV,NewString)函数对其进行显示,调用一次SetDlgItemText(IDC_EDIT_RECV,NewString)函数,聊天记录区域就会重新刷新一次,由于这个功能我解决这问题就比较容易些。其次是对聊天记录进行存储:对聊天记录进行存储的时候要求在存储目录里建立一个独立文本文件进行存储,并对其进行隐藏,也就是说只有在打开这个文件的时候才达到查看聊天的目的。在开始的时候直接用基本C+文件处理方式进行编写,在调试过程中一直没有实现,后来采用CFile类进行处理。3、 程序中可以改进的地方说明。本次设计的软件只能进行基本的文本通信,确实有很多的遗憾。我觉得还可以改进和添加的功能有:a) 可以把聊天记录用一个独立的窗口进行显示b) 界面美工和排版c) 可以传输文件d) 可以进行语音或视频聊天四、用户手册运行环境:windows操作系统使用步骤:1、 找到快捷键图标,点击启动,启动后界面如下:2、 查询(可忽略),连接服务端或客户端:3、 在消息编辑框中编辑信息。4、 点击发送之后如下图所示:五、设计总结:本次课程设计进行了两周时间,开始的时候真是无从下手,在第一周前三天一直在给自己充电,翻阅各个关于MFC和网络编程的书籍,这段时间是最难熬的!后来开始着手做的时候,问题蜂拥而至,不过好在得到很多同学的协助,在看到一个个问题被解决,一个个功能慢慢的实现,自己感觉很有成就感。经历里两周的学习和努力,不仅让我完成了开发,也让我了解了一个基本的windows应用软件的开发过程;当我们面对开发的时候,首先要分析它的需求是什么、需要具备什么功能,并画出各个功能的关系图,然后再对其进行抽象,一步步的把各个问题逐一解决;我觉得这是开发前就应该做好的准备工作,而不是盲目的一上来就写程序。总之,这次课程设计收获蛮大,我想会给我在今后的开发过程中打下一个好的基础。六、参考文件:1、李兰,任凤华. C+面向对象程序设计. 西安:西安电子科技大学出版社,20102、孔鹏 等. Visual C+ 6.0完全自学手册. 北京:机械工业出版社,20063、国家863中部软件孵化器. Visual C+ 从入门到精通. 北京:人民邮电出版社,20105、 孙鑫. VC+ 深入详解(修订版). 北京:电子工业出版社,2012七、附录:/服务端源程序:/所有头文件/CHAT.h/ CHAT.h : main header file for the CHAT application/#if !defined(AFX_CHAT_H_099932BD_85F3_4116_8495_2144DE31CCA4_INCLUDED_)#define AFX_CHAT_H_099932BD_85F3_4116_8495_2144DE31CCA4_INCLUDED_#if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000#ifndef _AFXWIN_H_#error include stdafx.h before including this file for PCH#endif#include resource.h/ main symbols/ CCHATApp:/ See CHAT.cpp for the implementation of this class/class CCHATApp : public CWinApppublic:CCHATApp();/ Overrides/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CCHATApp)public:virtual BOOL InitInstance();/AFX_VIRTUAL/ Implementation/AFX_MSG(CCHATApp)/ NOTE - the ClassWizard will add and remove member functions here./ DO NOT EDIT what you see in these blocks of generated code !/AFX_MSGDECLARE_MESSAGE_MAP();/AFX_INSERT_LOCATION/ Microsoft Visual C+ will insert additional declarations immediately before the previous line.#endif / !defined(AFX_CHAT_H_099932BD_85F3_4116_8495_2144DE31CCA4_INCLUDED_)/CHATDlg.h/ CHATDlg.h : header file/#if !defined(AFX_CHATDLG_H_6C40F38D_492D_4F8B_B026_45140A4B54F4_INCLUDED_)#define AFX_CHATDLG_H_6C40F38D_492D_4F8B_B026_45140A4B54F4_INCLUDED_#if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000/ CCHATDlg dialog#define WM_RECVDATAWM_USER+1struct RECVPARAMSOCKET sock;HWND hwnd;class CCHATDlg : public CDialog/ Constructionpublic:int Record(CString recordString);/SOCKADDR_IN ClientAddr;/SOCKADDR_INServerAddr;static DWORD WINAPI RecvProc(LPVOID lpParameter);BOOL InitSocket();CCHATDlg(CWnd* pParent = NULL);/ standard constructor/ Dialog Data/AFX_DATA(CCHATDlg)enum IDD = IDD_CHAT_DIALOG ;CEditm_SEND;CListBoxm_IPAddr;CEditm_HostName;CStringm_RECV;/AFX_DATA/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CCHATDlg)protected:virtual void DoDataExchange(CDataExchange* pDX);/ DDX/DDV support/AFX_VIRTUAL/ Implementationprotected:HICON m_hIcon;/ Generated message map functions/AFX_MSG(CCHATDlg)virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnBtnSend();afx_msg void OnChangeEditSend();afx_msg void OnBUTTONsearch();/AFX_MSGafx_msg void OnRecvData(WPARAM wParam,LPARAM lParam);DECLARE_MESSAGE_MAP()private:SOCKET m_socket;/AFX_INSERT_LOCATION/ Microsoft Visual C+ will insert additional declarations immediately before the previous line.#endif / !defined(AFX_CHATDLG_H_6C40F38D_492D_4F8B_B026_45140A4B54F4_INCLUDED_)/Resource.h:/NO_DEPENDENCIES/ Microsoft Developer Studio generated include file./ Used by CHAT.rc/#define IDM_ABOUTBOX 0x0010#define IDD_ABOUTBOX 100#define IDS_ABOUTBOX 101#define IDD_CHAT_DIALOG 102#define IDR_MAINFRAME 128#define IDB_BITMAP1 129#define IDB_BITMAP2 130#define IDB_BITMAP3 131#define IDB_BITMAP4 132#define IDB_BITMAP5 133#define IDI_ICON1 138#define IDC_EDIT_RECV 1000#define IDC_EDIT_SEND 1002#define IDC_BTN_SEND 1003#define IDC_ 1005#define IDC_IPADDRESS2 1006#define IDC_IPADDRESS1 1007#define IDC_SCROLLBAR2 1009#define IDC_SCROLLBAR4 1011#define IDC_EDIT1 1015#define IDC_BUTTONsearch 1016#define IDC_LIST1 1018#define IDC_BUTTON_record 1026/ Next default values for new objects/ #ifdef APSTUDIO_INVOKED#ifndef APSTUDIO_READONLY_SYMBOLS#define _APS_NEXT_RESOURCE_VALUE 139#define _APS_NEXT_COMMAND_VALUE 32771#define _APS_NEXT_CONTROL_VALUE 1027#define _APS_NEXT_SYMED_VALUE 101#endif#endif/ stdafx.h :/ include file for standard system include files,/ or project specific include files that are used frequently, but/ are changed infrequently/#if !defined(AFX_STDAFX_H_B1BA2DB1_3EC9_4E49_A61B_6EC314CB0C34_INCLUDED_)#define AFX_STDAFX_H_B1BA2DB1_3EC9_4E49_A61B_6EC314CB0C34_INCLUDED_#if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000#define VC_EXTRALEAN/ Exclude rarely-used stuff from Windows headers#include / MFC core and standard components#include / MFC extensions#include / MFC Automation classes#include / MFC support for Internet Explorer 4 Common Controls#ifndef _AFX_NO_AFXCMN_SUPPORT#include / MFC support for Windows Common Controls#endif / _AFX_NO_AFXCMN_SUPPORT#include /AFX_INSERT_LOCATION/ Microsoft Visual C+ will insert additional declarations immediately before the previous line.#endif / !defined(AFX_STDAFX_H_B1BA2DB1_3EC9_4E49_A61B_6EC314CB0C34_INCLUDED_)/所以.CPP文件/ CHAT.cpp : Defines the class behaviors for the application./#include stdafx.h#include CHAT.h#include CHATDlg.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CCHATAppBEGIN_MESSAGE_MAP(CCHATApp, CWinApp)/AFX_MSG_MAP(CCHATApp)/ NOTE - the ClassWizard will add and remove mapping macros here./ DO NOT EDIT what you see in these blocks of generated code!/AFX_MSGON_COMMAND(ID_HELP, CWinApp:OnHelp)END_MESSAGE_MAP()/ CCHATApp constructionCCHATApp:CCHATApp()/ TODO: add construction code here,/ Place all significant initialization in InitInstance/ The one and only CCHATApp objectCCHATApp theApp;/ CCHATApp initializationBOOL CCHATApp:InitInstance()if(!AfxSocketInit()/加载套接字AfxMessageBox(加载套接字库失败!);return FALSE;AfxEnableControlContainer();/ Standard initialization/ If you are not using these features and wish to reduce the size/ of your final executable, you should remove from the following/ the specific initialization routines you do not need.#ifdef _AFXDLLEnable3dControls();/ Call this when using MFC in a shared DLL#elseEnable3dControlsStatic();/ Call this when linking to MFC statically#endifCCHATDlg dlg;m_pMainWnd = &dlg;int nResponse = dlg.DoModal();if (nResponse = IDOK)/ TODO: Place code here to handle when the dialog is/ dismissed with OKelse if (nResponse = IDCANCEL)/ TODO: Place code here to handle when the dialog is/ dismissed with Cancel/ Since the dialog has been closed, return FALSE so that we exit the/ application, rather than start the applications message pump.return FALSE;/ CHATDlg.cpp : implementation file/#include stdafx.h#include CHAT.h#include CHATDlg.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialogpublic:CAboutDlg();/ Dialog Data/AFX_DATA(CAboutDlg)enum IDD = IDD_ABOUTBOX ;/AFX_DATA/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV support/AFX_VIRTUAL/ Implementationprotected:/AFX_MSG(CAboutDlg)/AFX_MSGDECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD)/AFX_DATA_INIT(CAboutDlg)/AFX_DATA_INITvoid CAboutDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CAboutDlg)/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CAboutDlg, CDialog)/AFX_MSG_MAP(CAboutDlg)/ No message handlers/AFX_MSG_MAPEND_MESSAGE_MAP()/ CCHATDlg dialogCCHATDlg:CCHATDlg(CWnd* pParent /*=NULL*/): CDialog(CCHATDlg:IDD, pParent)/AFX_DATA_INIT(CCHATDlg)m_RECV = _T();/AFX_DATA_INIT/ Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);void CCHATDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CCHATDlg)DDX_Control(pDX, IDC_EDIT_SEND, m_SEND);DDX_Control(pDX, IDC_LIST1, m_IPAddr);DDX_Control(pDX, IDC_EDIT1, m_HostName);DDX_Text(pDX, IDC_EDIT_RECV, m_RECV);/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CCHATDlg, CDialog)/AFX_MSG_MAP(CCHATDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BTN_SEND, OnBtnSend)ON_EN_CHANGE(IDC_EDIT_SEND, OnChangeEditSend)ON_BN_CLICKED(IDC_BUTTONsearch, OnBUTTONsearch)/AFX_MSG_MAPON_MESSAGE(WM_RECVDATA,OnRecvData)END_MESSAGE_MAP()/ CCHATDlg message handlersBOOL CCHATDlg:OnInitDialog()CDialog:OnInitDialog();/ Add About. menu item to system menu./ IDM_ABOUTBOX must be i

温馨提示

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

评论

0/150

提交评论