ImageVerifierCode 换一换
格式:DOCX , 页数:34 ,大小:655.54KB ,
资源ID:2063618      下载积分:2 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/2063618.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(局域网聊天程序设计.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

局域网聊天程序设计.docx

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