1、局域网聊天程序设计青岛理工大学C+面向对象课程设计报告院(系):计算机工程学院专业:软件工程学生姓名: 管巨伟班级软件 132 学号: 201307227题目:局域网聊天程序设计起迄日期:2015.6.29 2015.7.10设计地点:计算机学院机房指导教师: 李传斌 杨鑫完成日期:2015 年7月10日任务书一、课程设计目的与要求1课程设计目的面向对象程序设计作为一门软件设计的课程, 具有极强的实践性, 必须使学生具备灵活 应用理论知识的能力及面向对象程序设计技能。所以在 C+ 面向对象程序设计课程学习 完成后,安排课程设计教学环节。通过课程设计, 使学生实际掌握面向对象的程序设计方法, 了
2、解 C+ 面向对象的设计方 法与技巧,有效地、深刻地理解课程内容,体会理论、方法和设计原则;培养学生分析实际 问题和解决问题的能力,使学生具备使用面向对象程序设计开发工具设计实际系统的能力。2课程设计要求结构化程序设计使用的是功能抽象, 面向对象程序设计不仅能进行功能抽象, 而且能进 行数据抽象。“对象”实际上是功能抽象和数据抽象的统一。 C+语言的“对象”是“类”的实例,程序设计的基础是设计类,所以类的有关概念都是重点,尤其要抓住抽象、封装、 继承和多态性等要素。面向对象程序设计的核心是类层次的设计。 而具体类的设计的重点是如何选择数据成员 和成员函数。 根据数据成员和成员函数的特点, 结合
3、具体问题设计合适的类。 成员函数设计 中的难点是选择函数类型及其参数传递方式。开发系统离不开设计平台, 学生应在掌握面向对象程序设计基础上, 熟悉并能熟练使用 面向对象程序设计开发平台,结合相关理论知识,进行相应系统开发。二、课程设计内容课程设计题目及要求局域网聊天程序设计: 服务端设置, 通过对客户端多个线程的监听, 显示客户端的上线、 下线,与客户端进行信息交流。开启服务器是通过新建 socket,绑定端口号,监听线程,等待客户端连入。创建动态数组,完成客户端的连入,存储客户端信息。结束线程,完成对资 源释放。课程设计报告内容一、需求分析1.选做此课题或项的目的开发此聊天程序旨在供个人聊天
4、交流使用, 进行多人并发聊天, 交流思想见解, 让使用同时了解现今正在使用的交流软件的基础功能,多个任务同时进行的原理,拓展自己的视野, 含的交互式界面的实现及应用。2.程序所实现的功能客户端:1获取输入的IP地址,2、获取通信的端口号,3、获取从服务器发来的信息, 4、给服务器发送用户自定义的数据。服务端:1、获取客户端 IP 地址, 2、获取通信的端口号, 3、记录客户端连入的台数, 4、向所有连入客户端发送消息, 5、接收客户端发送过来的信息其他:进行网络的设置、关闭运行的程序、发送消息、系统托盘、系统托盘下对程序的显示 和退出操作。二、内容设计1.根据所选题目,给出模块图2.画出主程序
5、及其主要模块的流程图3.编写程序关键代码 客户端的线程函数 : #include stdafx.h #include ChatRoomDlg.h#include Inc.hDWORD WINAPI ConnectThreadFunc(LPVOID pParam)CChatRoomDlg *pChatRoom = (CChatRoomDlg *)pParam;/ 创建指向窗口的指针 ASSERT(pChatRoom != NULL);/ 判断线程是否为创建成功 pChatRoom-m_ConnectSock = socket(AF_INET , SOCK_STREAM , IPPROTO_TCP
6、);/创建 socket 并用一个变量保存if ( pChatRoom-m_ConnectSock = INV ALID_SOCKET ) /判断 socket 是否创建成功AfxMessageBox(_T( 新建 Socket 失败! );return FALSE;CString strServIp; pChatRoom-GetDlgItemText(IDC_IP_ADDR, strServIp);/ 获得服务端 IP 地址 int iPort = pChatRoom-GetDlgItemInt(IDC_CONNECT_PORT);/ 获得端口号 if ( iPort 65535 ) Afx
7、MessageBox(_T( 请输入合适的端口: 1 - 65535);goto _Error_End;char szIpAddr16 = 0;/ 将宽字节转换成窄字节USES_CONVERSION; strcpy_s(szIpAddr, 16, T2A(strServIp); sockaddr_in server;/ 提供服务端信息 server.sin_family = AF_INET;server.sin_port = htons(iPort);/ 转换并存储端口 server.sin_addr.s_addr = inet_addr(szIpAddr);/ 转换并存储 IP 地址 if
8、( connect(pChatRoom-m_ConnectSock,(struct sockaddr *)&server,sizeof(struct sockaddr) = SOCKET_ERROR ) AfxMessageBox(_T( 连接失败,请重试! ); goto _Error_End; pChatRoom-m_bIsServer = FALSE;/ 用于判断后面发送消息的是客户端 pChatRoom-ShowMsg(_T( 系统信息:连接服务器成功! ); while( TRUE & !(pChatRoom-bShutDown) if ( SOCKET_Select(pChatRo
9、om-m_ConnectSock) ) TCHAR szBufMAX_BUF_SIZE = 0;int iRet = recv(pChatRoom-m_ConnectSock, (char *)szBuf, MAX_BUF_SIZE, 0);/ 收取数据 if ( iRet 0 ) / 连接成功pChatRoom-ShowMsg(szBuf);else/ 连接失败pChatRoom-ShowMsg(_T( 聊天室服务器已停止,请重新进行连接! ); break;Sleep(500);_Error_End: closesocket(pChatRoom-m_ConnectSock);/ 关闭线程
10、return TRUE;服务端的线程函数 :#include stdafx.h#include ChatRoomDlg.hBOOL SOCKET_Select(SOCKET hSocket, int nTimeOut, BOOL bRead)/ 去缓冲区中查看是否 有 socket 连接fd_set fdset;timeval tv;/ 超时时间 FD_ZERO(&fdset);/ 清 0 FD_SET(hSocket, &fdset);nTimeOut = nTimeOut 1000 ? 1000 : nTimeOut;tv.tv_sec = 0;/ 以秒为单位tv.tv_usec = nT
11、imeOut;/ 一毫秒为单位int iRet = 0;if ( bRead ) iRet = select(0, &fdset, NULL , NULL, &tv);/ 监听可读文件 elseiRet = select(0, NULL , &fdset, NULL, &tv);/ 监听可写if(iRet m_ListenSock = socket(AF_INET , SOCK_STREAM , IPPROTO_TCP);/ 创/建 socket 并用一个变量保存if ( pChatRoom-m_ListenSock = INV ALID_SOCKET ) / 如果创建的 socket 是无效
12、套接字AfxMessageBox(_T( 新建 Socket 失败! );return FALSE;int iPort = pChatRoom-GetDlgItemInt(IDC_LISTEN_PORT);if ( iPort 65535 ) AfxMessageBox(_T( 请输入合适的端口: 1 - 65535);goto _Error_End;sockaddr_in service;/ 定义结构储存 IP ,端口号用于 bindservice.sin_family = AF_INET;service.sin_addr.s_addr = INADDR_ANY;service.sin_po
13、rt = htons(iPort);if ( bind(pChatRoom-m_ListenSock, (sockaddr*)&service, sizeof(sockaddr_in) =SOCKET_ERROR ) / 判断绑定端口是否成功AfxMessageBox(_T( 绑定端口失败! );goto _Error_End;if( listen(pChatRoom-m_ListenSock, 5) = SOCKET_ERROR ) / 判断监听端口是否成功AfxMessageBox(_T( 监听失败! );goto _Error_End;pChatRoom-ShowMsg(_T( 系统信息
14、:启动服务器成功! );pChatRoom-m_bIsServer = TRUE;/ 用于判断后面发送消息的是服务端 pChatRoom-EnableWindow(IDC_START_SERVER, FALSE);/ 隐藏窗口 pChatRoom-EnableWindow(IDC_STOP_SERVER);while( TRUE & !(pChatRoom-bShutDown) / 为了连接多个客户端if ( SOCKET_Select(pChatRoom-m_ListenSock, 100, TRUE) ) / 查看缓冲区中是否/有连接的客户端 sockaddr_in clientAddr;/ 定义变量供 accept 使用 int iLen = sizeof(sockaddr_in);SOCKET accSoc
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1