




免费预览已结束,剩余10页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
I 摘要 本课程设计是利用 WinSock 编程来实现基于 UDP 协议的网络聊天工具设计, UDP(User Datagram Protocol用户数据报协议) 协议是无连接的协议,是 TCP/IP 协议 的一种分层协议。设计中我们利用 MFC 编程,对程序的界面进行设计,通过设计进一步 掌握利用 Visual C+进行程序设计的能力理解和运用面向对象程序设计的思想和方法,初 步掌握开发一个小型实用系统的基本方法,理解 Windows 程序的运行过程以及掌握 Winsocket 编程方法。本设计实现的聊天工具要求有客户端和服务器端。客户端能实现消 息的输入和发送、接收消息、连接服务器与断开连接等基本功能;服务器端能收发信息、 保存客户端的 IP 信息地址、将接收到的消息向所有客户端转发等基本信息。 关键字:WinSock 编程,UDP 协议,TCP/IP 协议,MFC 编程,Windows 程 序 重庆科技学院Windows 程序设计课程设计报告 2 目录 1 设计目的与要求.1 1.1 设计目的.1 1.2 设计内容.1 1.3 设计要求.1 2 设计环境或器材、原理与说明.3 2.1 设计环境与器材.3 2.2 原理与说明.3 3 设计过程及程序代码.4 3.1 服务器端设计.4 3.1.1 服务器端程序流程设计.4 3.1.2 服务器端界面设计.4 3.1.3 服务器端套接字的具体操作.5 3.1.4 链表的维护以及消息的广播.6 3.1.5 连接请求与断开连接.6 3.2 客户端的设计.6 3.2.1 客户器端程序流程设计.6 3.2.2 客户端界面设计.7 3.2.3 客户端的功能实现.8 4 设计结果与分析.10 4.1 设计结果.10 4.2 设计分析.11 5 设计体会与建议.12 参考文献.13 重庆科技学院Windows 程序设计课程设计报告 3 基于 UDP 协议的网络聊天工具设计 1 设计目的与要求 1.1 设计目的 1、进一步掌握利用 Visual C+进行程序设计的能力; 2、进一步理解和运用面向对象程序设计的思想和方法; 3、初步掌握开发一个小型实用系统的基本方法; 4、学会调试一个较长程序的基本方法; 5、理解 Windows 程序的运行过程; 6、掌握 winsocket 编程方法。 1.2 设计内容 本实验设计内容是:设计一个程序,实现聊天功能,要求有客户端和服务器端。客户 端能实现消息的输入和发送、接收消息、连接服务器与断开连接等基本功能;服务器端 要求能收发信息、保存客户端的 IP 信息地址、将接收到的消息向所有客户端转发等基本 信息。 1.3 设计要求 整个程序使用 winsocket 函数做网络数据收发,基于 UDP 协议。可以直接使用 Windows API 编程(SDK 编程) ,也可以使用 MFC 编程。本课程设计中我们使用的是 MFC 编程。其具体的设计要求如下所述: 1、服务器端: 在服务器端,当服务器端程序运行时便初始化 socket, 创建服务器端,在服务器端包 含一个发送窗口和一个接收窗口,以及一个 ListBox 来显示当前连接到服务器上的客户端 的 IP 地址。 服务器端功能: 1、初始化 socket, 创建服务器端。 重庆科技学院Windows 程序设计课程设计报告 4 2、接受用户传送来的连接判断命令,并向用户发出响应命令。 3、维护一个链表,保存所有用户的 IP 地址。显示所有在线 IP。 4、向链表中的所有用户发送系统消息。 5、接受用户传送来的聊天信息,然后向链表中的所用用户转发。 2、客户端: 客户端界面,有一个用于显示接受的聊天信息,和一个用来接受用户输入的聊天 信息。当按下“发送”按钮时将信息发送给服务器。程序运行后用户先输入自己呢称然后进 行连接,如果成功则在接收窗口输出成功提示,否则弹出连接失败警告框。在连接好之 后用户也可以选择与服务器断开。 重庆科技学院Windows 程序设计课程设计报告 5 2 设计环境或器材、原理与说明 2.1 设计环境与器材 因为选择使用 MFC 编程,该程序又是网络编程,所以设计环境与器材为: PC 机两到三台(程序试运行时需要多台电脑充当客户端); 能正常连接的网卡; Windows 环境与 Microsoft Visual C+ 6.0 编译环境; 2.2 原理与说明 在计算机网络中,信息的传输是建立在物理传输介质与网络传输协议上的,TCP/IP 协议是网络协议的一种,它分为不同的层次:TCP(Transmission Control Protocol传输 控制协议),UDP(User Datagram Protocol用户数据报协议);IP(Internet Protocol网 际协议);它们分别工作于传输层与网络层。Window Socket 是 Windows 下的标准网络程 序设计接口,它是由一些 API 函数组成,用以提供对网络通信的支持。 该程序设计使用 Windows Sockets 编程。在数据传输协议中,我们使用 UDP 协议, UDP 协议是无连接的协议,在服务器端不调用 listen 函数进行监听,也不调用 accept 函数 建立连接, 其操作流程图如下图所示: 服务器端 客户端 socket函数建立套接字 bind 函数给套接字指定本地地址 send 函数和 reve 函数收发数据 closesocket 函数关闭套接字 socket函数建立套接字 bind 函数给套接字指定本地地址 send 函数和 reve 函数收发数据 closesocket 函数关闭套接字 图图 2-1 无连接协议的套接字操作流程图无连接协议的套接字操作流程图 首先,用 socket 函数建立套接字,然后根据本地的 IP 进行绑定,然后就可以通过使用 send 函数和 reve 函数来进行数据的发送和接收了。 重庆科技学院Windows 程序设计课程设计报告 6 3 设计过程及程序代码 3.1 服务器端设计 3.1.1 服务器端程序流程设计 下图是服务器端的程序流程设计图,当程序开始运行时,便初始 WinSock 环境。初始 化完成后,程序便等待客户端的接入和等待接收信息。如果客户端发起请求连接的 connect 请求,便将该客户端的 IP 加如链表,并在 ListBox 中显示出来;如果收到的是已 经建立好连接的客户端发来的消息信息,则遍历链表,将收到的消息向链表中所保存的 所有的客户端发送并在服务器端的接收窗口显示该消息;如果收到客户端发送来的断开 连接请求,则在 ListBox 和链表中删除该客户端的 IP。关闭窗口程序结束。 开始 初始化W i nSock环 境 等待接收信息 遍历链表向链表中所有 的用户转发信息 接收信息是否为 连接信息 在接收窗口显 示信息 在链表和Li st Box 中添加对应I P connect connect 在链表和Li st Box 中删除对应I P di sconnect di sconnect 图图 3-1 服务器端程序设计服务器端程序设计 3.1.2 服务器端界面设计 使用 MFC 可以很方便的建立对话框,在打开 Microsoft Visual C+ 6.0 后建立一个 MFC AppWizardexe工程,然后在选择类型对话框中选择 Dialog Based,在选择包含部分 时选择 Windows Sockets,然后点击完成,于是便有了一个基本的对话框。我们可以通过 重庆科技学院Windows 程序设计课程设计报告 7 MFC 中提供的编辑工具在该对话框中进行设计,如添加文本框、按钮、静态文本框、 ListBox 等。然后根据需要对各个控件的属性等进行设定,下图是根据客户端功能需求所 设计的客户端界面: 图图 3-2 客户端界面设计客户端界面设计 当有客户端连入后,客户端的 IP 会自动的显示在“在线主机列表”下的 ListBox 中,其下 面的删除按钮可以将 ListBox 中所选的 IP 删除;所有客户端发来的消息和服务器自己所 发的消息都在接收窗口中显示,并可通过清除内容按钮清除内容;服务器端也可以向所 有客户端发送系统消息,该功能通过发送窗口和右边的发送、清除按钮实现。 3.1.3 服务器端套接字的具体操作 该程序设计使用 UDP 无连接的用户数据报协议,所以在设计中我们不调用 listen 函数 进行监听,也不调用 accept 函数建立连接,其操作流程可见图 3-1。下面是在程序设计中 建立套接字、绑定的具体实现: / socket 函数建立套接字 WSAStartup(MAKEWORD(2, 0), /初始化套接字 m_sockLocal = socket(AF_INET, SOCK_DGRAM, 0);/创建本地服务套接字 /选择程序要处理的网络事件:WM_SOCKET 和 FD_READ WSAAsyncSelect(m_sockLocal, GetSafeHwnd(), WM_SOCKET, FD_READ); m_addr_in.sin_addr.S_un.S_addr = inet_addr(172.17.50.35);/指定 IP 地址(服务器所在系统 IP 地址) m_addr_in.sin_family = AF_INET;/协议族 m_addr_in.sin_port = htons(SERVER_PORT);/服务器端口号 bind(m_sockLocal, (SOCKADDR*)/ bind 函数给套接字指定本地地址 下面分别是接收和发送数据的具体代码: recvfrom(m_sockLocal, buf, 1024, 0, (SOCKADDR*) sendto(m_sockLocal, buf, 1024, 0, (SOCKADDR*) 重庆科技学院Windows 程序设计课程设计报告 8 3.1.4 链表的维护以及消息的广播 在该程序的服务器端设计了一个链表,用来保存所有在线的客户端的 IP 地址。当服 务器端收到客户端发送来的连接请求消息时,便把该客户端的 IP 加人到建立的链表中去, 在广播消息的时候可以通过遍历该链表将消息发送给每一个客户端。 下面分别是建立链表、遍历链表、增加删除链表的具体实现代码: /定义一个用来保存 IP 的链表 list IPlist; list:iterator iter; /对链表的增加、删除 IPlist.push_back(IP); IPlist.remove(IP); / 遍历链表以广播接收到的客户消息 for (iter = IPlist.begin(); iter != IPlist.end(); iter+)/从链表的开始结点到结束结点 IP = (*iter); m_addrfrom.sin_addr.s_addr=inet_addr(IP); sendto(m_sockLocal, buf, 1024, 0, (SOCKADDR*) 3.1.5 连接请求与断开连接 当客户端开启并发出连接信息时,在服务器端判断,如果是连接请求信息“connect” 则如上一节所述将其 IP 加入链表同时加入 ListBox 显示出来,并向客户端发送连接成功 的确认信息。如果服务器端将某个 IP 从链表中删除,也需要给客户端发送一个断开连接 提示信息。若是客户端选则了断开连接,则当服务器端收到相应的断开信息后就将链表 中对应的 IP 删除。 3.2 客户端的设计 3.2.1 客户器端程序流程设计 下图为客户端的程序流程图,和服务器相同程序一开始便使用 socket 函数建立套接字 初始化 WinSock 环境。然后输入服务器端的 IP 地址并发起连接请求,如果连接超时则返 回输入 IP 状态,若成功则可发送和接收消息,在此过程中如果服务器将本客户端断开, 则返回输入 IP 态。若客户端自己选择与服务器断开,则向服务器发送断开信息并返回到 重庆科技学院Windows 程序设计课程设计报告 9 输入 IP 状态继续循环,知道关闭窗口。 开始 初始化W i nSock环境 发送连接信息并等待回应 输入服务器I P地址等 是否连接成功? 消息发送和接收 是否为断开 消息? Y N N Y 图图 3-33-3 客户端程序流程图客户端程序流程图 3.2.2 客户端界面设计 与服务器端的界面设计相同,只需根据需求设计出相应的控件,客户端界面设计如下 图所示: 图图 3-43-4 客户端界面设计客户端界面设计 重庆科技学院Windows 程序设计课程设计报告 10 3.2.3 客户端的功能实现 (1)初始化 WinSock 环境 与服务器端基本相同,具体代码如下: / socket 函数建立套接字 WSAStartup(MAKEWORD(2, 0), /初始化套接字 m_sockLocal = socket(AF_INET, SOCK_DGRAM, 0);/创建本地服务套接字 WSAAsyncSelect(m_sockLocal, GetSafeHwnd(), WM_SOCKET, FD_READ); /选择需要处理的网络时间 m_addr_in.sin_addr.S_un.S_addr = inet_addr(m_Str_IP);/服务器 IP 地址 m_addr_in.sin_family = AF_INET;/协议族 m_addr_in.sin_port = htons(9001);/服务器断口 bind(m_sockLocal, (SOCKADDR*)/绑定 在套接字建立好之后只需用以下两个函数就可以收发信息了,注意需指明长度。 /收发信息 recvfrom(m_sockLocal, buf, 1040, 0, (SOCKADDR*) sendto(m_sockLocal, buf, 1024, 0, (SOCKADDR*) (2)与服务器连接断开的具体实现 当点击连接按钮后,客户端向服务器端发出一个连接请求信息,然后等待回应,如果 连接不成功则返回,成功后则可进行消息的接收和发送。若连接成功后用户点击断开连 接按钮,则程序向服务器端发出断开连接信息。具体实现代码如下: 连接请求: /点击连接按钮,发送连接请求信息 void CUDPClientDlg:OnBUTTONConnect() / TODO: Add your control notification handler code here m_editRecv.SetWindowText(); UpdateData(TRUE); if(m_Str_IP = ) AfxMessageBox(TEXT(请输入服务器 IP 地址!); return; /发送连接请求 char bufConnect8 = connect; m_addrto.sin_addr.S_un.S_addr = inet_addr(m_Str_IP); m_addrto.sin_family = AF_INET; m_addrto.sin_port = htons(8008); sendto(m_sockLocal, bufConnect, 7, 0, (SOCKADDR*) /使能控件 . Checked = 1; 重庆科技学院Windows 程序设计课程设计报告 11 /在接收时判断信息 LRESULT CUDPClientDlg:OnSocket(WPARAM wParam, LPARAM lParam) if (LOWORD(lParam) != FD_READ) return 0; char buf1024; int i; m_fromlen = sizeof(m_addrfrom); recvfrom(m_sockLocal, buf, 1040, 0, (SOCKADDR*) if(Checked = 1 i80; i+) if(strcmp(buf,连接成功!) = 0) strcat(buf,rn); m_editRecv.ReplaceSel(buf); j=0; return 0; else Sleep(5); Checked = 0; Sleep(30); AfxMessageBox(TEXT(连接服务器失败!); /使能控件.此处略去 return 0; strcat(buf,rn); m_editRecv.ReplaceSel(buf); return 0; 发送断开请求: 该功能就只是给服务器发送一个特定的断开请求消息,服务器根据消息将该客户端的 IP 从 ListBox 和链表中删除,以达到断开的目的。 sendto(m_sockLocal, bufDisConnect, 11, 0, (SOCKADDR*) 重庆科技学院Windows 程序设计课程设计报告 12 4 设计结果与分析 4.1 设计结果 下面使用一些程序运行的截图的对程序最终结果进行简单的阐述: 下图是客户端连接服务器图,开启了客户端后先输入用户的呢称再输入服务器的 IP 地址,然后电击连接按钮程序便发送出连接请求信息,如过在设定的时间内没有收到应 答,则弹出连接失败提示,如下图: 图图 4-14-1 客户端连接服务器图客户端连接服务器图 当连接成功后,客户端的接收窗口会显示连接成功的提示,下图可见。然后就可以进 行正常的消息收发。当客户端选择断开时,向服务器发送断开连接信息,然后断开。 图图 4-24-2 客户端消息收发图客户端消息收发图 下图是服务器端的运行结果,当有客户端连接到该服务器端时,服务器的再线列表列 出所有的客户端 IP,然后可接收和转发所有客户端发送来的消息,同时服务器端也可发 送消息给所有的客户端,如果服务器想让某个客户端被断开,则将其 IP 删除即可。 重庆科技学院Windows 程序设计课程设计报告 13 图图 4-34-3 服务器端消息收发图服务器端消息收发图 4.2 设计分析 因为该程序是利用无连接的 UDP 协议实现功能需求的,所以在建立套接字的过程中, 不需要调用 listen 函数进行监听,也不调用 accept 函数建立连接。连接消息的确认使用发 送特定的信息进行连接和连接判断。服务器端对消息的转发以及服务器消息的广播实现 是通过对保存 IP 的链表进行遍历。客户端的断开也是通过触发服务器端对链表中对应的 IP 地址删除实现的。程序的不足在与当客户端直接关闭时,服务器没有能响应将链表中 的对应 IP 值删除,还需要改进。 重庆科技
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 河南省新乡市封丘县第一中学2025-2026学年高二上学期开学考试历史试题(含答案)
- 偏旁部首的使用规则课件
- 你好小鸟课件
- 2025征地相关面试题答案及答案
- 子宫内膜异位症合并卵巢浆液性癌护理查房
- 企业班组安全培训课件
- 志愿服务项目设计与管理指南
- 企业消防安全培训课件
- 瑞安公务接待管理办法
- 留置监管分离管理办法
- 2023江苏省高中学业水平合格性考试英语模拟试卷(含答案详解1)
- 低于成本价中标造成的价格争议
- CPR心肺复苏课件
- 化验室培训记录
- (完整word)化学各仪器矢量图合集
- 埃菲尔铁塔精品课件
- 德国工业标准DIN8077聚丙烯(PP)管材尺寸赵彦波
- 拖拉机和联合收割机查验记录表
- (公开课)26个英文字母书写笔顺动态演示(基础教育)
- Q∕GDW 11304.2-2021 电力设备带电检测仪器技术规范 第2部分:红外热像仪
- 部编版一年级道德与法治上册第1课《开开心心上学去》精品课件
评论
0/150
提交评论