计算机网络课设-基于TCP协议编程的网络聊天室
- 格式:docx
- 大小:107.14 KB
- 文档页数:28
基于TCPIP的网络聊天工具的设计与实现—毕业设计论文本章将介绍网络聊天工具的背景和意义,并概述论文的研究目的和方法。
网络聊天工具是一种实时通信工具,通过互联网连接用户,使得用户可以在不同地点进行文字、语音和视频的交流。
随着互联网的发展和智能手机的普及,网络聊天工具变得越来越重要。
它不仅改变了人们的交流方式,也改变了社交模式。
本论文的研究目的是设计和实现一种基于TCPIP协议的网络聊天工具。
TCPIP协议是互联网的基础协议之一,广泛应用于数据传输和通信。
通过基于TCPIP协议的设计,我们可以实现一个高效、稳定和安全的网络聊天工具。
论文的研究方法主要包括以下几个步骤:确定网络聊天工具的功能需求:分析用户对网络聊天工具的需求,包括文字、语音和视频交流等功能。
设计系统架构:根据功能需求,设计网络聊天工具的系统架构,包括客户端和服务器端的设计。
编码实现:根据系统架构,使用合适的编程语言和工具,进行网络聊天工具的编码实现。
测试和优化:对已实现的网络聊天工具进行测试,发现和修复潜在的问题,并对系统进行优化以提高性能和用户体验。
结果分析和总结:对网络聊天工具的设计与实现进行结果分析和总结,评估系统的优劣,并提出改进建议。
通过本论文的研究,我们将为用户提供一种高效、稳定和安全的网络聊天工具,满足用户对实时通信的需求,推动互联网通信技术的发展。
参考文献1参考文献2参考文献3网络聊天工具在现实生活和工作中的需求十分广泛。
它可以作为人们交流的重要工具,方便快捷地实现文字、语音和视频的沟通。
在进行需求分析时,我们需要深入调研和整理用户需求,以确保设计出一款满足用户期望的网络聊天工具。
一、现实生活中的需求社交需求:人们希望通过网络聊天工具与朋友、家人和同事保持联系,分享生活中的点滴,交流情感和心情。
商务需求:职场人士需要网络聊天工具来便捷地与同事、合作伙伴和客户进行沟通,共享文件、讨论项目进展等。
二、工作中的需求团队协作:团队成员需要网络聊天工具来实现实时的沟通与协作,提高工作效率。
基于TCP/IP的网络聊天工具设计【摘要】本系统是实现在局域网多人在线聊天的聊天工具,主要是采用套接字的原理进展编程,将Visual C++6.0作为开发平台,并结合使用VC++中的开发框架MFC。
系统是在TCP/IP网络环境下,采用客户机/效劳器的模式进展设计,将各任务合理的分配到效劳器和客户端,在很大程度减少系统资源的消耗以及通信的开销。
该聊天工具主要是设计成类似QQ群的聊天室,其中效劳器是接收并处理来自客户端的消息,客户端主要是实现申请新账号、进入聊天室、聊天室的群聊、用户间的私聊、发送和接收离线消息等主要功能。
本文主要针对系统的研究现状、研究目标、开发过程等进展说明,并对各个模块的设计流程进展详细分析。
【关键词】TCP/IP,Winsock网络编程,客户机/效劳器模式,聊天工具Design for the Network Chatting Tool Based on TCP/IP 【Abstract】:The system is a network chat tool which could make multiuser municates on line. The system is mainly use the socket principal to program.The program platform is VC++6.0 which has much function. And MFC class library is bined to make the system’s function e true. The Server and Client has the task on their’ own which is a wonderful network model can red uce the consumption of system. The chat tool is designed to be similar with QQ group where Server receives and deals with the datagram from Client. And the Client achieves the target. Such as register, log in, send and receive datagram and so on. The paper is mainly to explain the research status and program process. And then it also emphasizes on the design method of every block. 【Keyword】:TCP/IP, Winsock program,Client/Server,Chat Tool目录第一章引言11.1聊天系统的研究现状11.2 聊天系统的开发目标11.3 聊天系统的开发意义21.4 论文的主要容2第二章开发工具和关键技术32.1 开发工具32.2 TCP/IP协议42.3 客户机/效劳器模式42.4 套接字网络编程62.4.1套接字简介62.4.2 TCP套接字的应用7 2.5 MFC(Microsoft Foundation Class)92.5.1 MFC简介92.5.2 MFC类库9第三章、系统设计103.1设计原理103.2 系统总体功能构造113.3 建立类模型123.3.1效劳器端类123.3.2 客户端类13第四章系统模块详细设计154.1效劳器模块154.2 客户端模块154.2.1注册模块154.2.2登陆模块164.3 文字聊天模块164.3.1私聊模块164.3.2群聊模块17第五章系统测试175.1 测试目的175.2 测试容与结果175.2.1效劳器测试175.2.2 单元模块测试195.2.3系统评价:24第六章总结256.1毕业设计的总结25 6.2 经历和感想25致错误!未定义书签。
计算机网络课程设计报告学生姓名学号班级计算机0908班指导教师设计时间2012.1.7~2012.1.10目录第一章设计目的、任务1.1设计目的 (3)1.2设计的任务 (3)第二章系统分析设计2.1系统流程分析 (4)2.2系统功能需求分析 (5)2.3系统运行要求 (6)2.4系统数据要求 (6)第三章系统实现3.1 系统界面设计 (7)3.2 系统功能模块设计 (9)第四章体会和建议第一章设计目的、任务1.1设计目的1.了解通信规范的细节及其实现。
2.通过本次网络课程设计,掌握高级编程语言中对用户界面的设计方法,以及多线程技术、基于TCP/IP的Socket通信的编程方法,同时能够把协议的设计思想应用到实际中去。
1.2设计的任务编写一个聊天室,实现C/S模式的会话。
基本要求可以完成群聊、私人聊天,实时发送和显示聊天信息,完成好友列表;进一步要求带表情,附件发送,聊天信息的加密传送,设置黑名单等。
学习通信编程Socket接口编程,使用TCP或UDP接口完成信息传送,利用多线程技术实现服务器端的多个TCP连接的建立。
网络聊天是网络编程的典型应用之一,编写网络聊天软件对于学习网络编程无疑有着很大的帮助。
第二章系统分析设计2.1系统流程分析该C/S模式的聊天系统,就是服务器来提供服务端连接响应,客户端主动的发起连接请求。
当多个用户同时连接到服务器时,经由服务器的接收与转发便可以实现客户之间的通信。
因此,系统需要实现服务器端和客户端两部分程序。
下图是基本的客户端连接服务器的流程图。
对于整体系统的流程,也是分为两部分,即客户端的发起请求,服务器响应请求。
首先是客户端的登陆,客户端在登陆时,必须设置所想要连接的服务器,然后客户端就会根据设置的服务器IP地址,向服务器发起建立连接请求。
而服务器端是始终在监听网络状态的,主要检测到有一个连接请求,那么服务器就会给当前的发起端分配一个服务线程,用于处理它的各种请求。
南京工程学院通信工程学院课程设计说明书(论文) 题目网络聊天室的设计课程名称通信应用软件课程设计专业计算机通信班级算通111学生姓名余丹红学号 208110410设计地点信息楼C216指导教师耿鹏设计起止时间:2013年12月2日至2013年12月6日目录第一章.概述........................................... 错误!未定义书签。
1.1L INUX简介 (3)1.1TCP/UDP简介 (3)1.2.1TCP通信 (3)1.2.2UDP通信 (3)1.3S OCKET简介 (4)1.4关系模式 (4)第二章.课题设计介绍 (4)2.1课题背景 (5)2.2发展与现状 (8)2.3功能概述 (10)2.4系统结构设计 (10)2.5流程图 (10)第三章.程序实现 (12)3.1方案模块简介.................................... 错误!未定义书签。
3.2相关函数解释 (14)3.2相关代码分析 (14)第四章.功能演示 (14)4.1测试过程说明.................................... 错误!未定义书签。
4.2结果显示 ......................................................................................................... 错误!未定义书签。
第五章.总结与展望. (16)5.1过程错误与分析 (16)5.2软件优缺点 (16)5.3课程设计心得 (16)第六章.参考文献....................................... 错误!未定义书签。
第一章概述1.1Linux简介Linux是一种针对PC计算机和工作站的操作系统,它具有像Windows和Mac那样的功能齐全的图形用户界面(GUI,Graphical User Interface)。
目录1前言 (3)课程设计的目的 (3)J A V A简介 (3)2需求分析 (6) (6) (6) (7) (7)3相关原理分析 (8)TCP/IP参考模型 (8)TCP的建立 (9)TCP传输原理 (10)套接字的客户端 (11)C/S模式 (11)4 总体设计 (13)5 详细设计 (14)................................................................................................................. 错误!未定义书签。
.. (15) (16) (16) (17) (17)6 调试 (18)7 结束语 ..................................................................................................... 错误!未定义书签。
参考文献. (23)附录:设计程序清单 (24)基于TCP/IP的网络聊天程序服务端设计摘要本课程设计的目标是基于Eclipse技术实现一个点对点通信程序,其工作机制模仿即时通信软件的基本功能,包括登陆,上线,传递信息等等。
采用TCP/IP原理,分别为客户端和服务器端完成基本数据配置,实现网络聊天功能。
在设计过程中,主要采用Eclipse编程环境,使用Java语言进行程序的编写,程序通过调试运行并且经过完善后,初步实现了设计的目标,能很好地在局域网环境实现即时聊天。
关键字Java语言;Eclipse;TCP/IP;套接字;C/S工作模式1前言21世纪是网络的世界,现在网络发展的不可估量了,它可以包括我们生活中的方方面面,小到上网购物、查找资料,大到网上理财、网上会议,可以说网络把我们的世界变小了,即使在天涯海角,有网络的地方我们就可以随时联系。
最简单的形式就是进行网络聊天了,这个很简单的聊天工具,可以随时拉近你我的距离[1]。
c 网络聊天室课程设计一、教学目标本课程旨在让学生了解网络聊天室的基本原理和功能,掌握C语言在网络编程中的应用,培养学生具备网络编程的基本能力和解决实际问题的能力。
具体目标如下:1.知识目标:(1)了解网络聊天室的基本概念和原理;(2)掌握C语言在网络编程中的基本方法;(3)理解网络编程中的Socket编程和TCP/IP协议。
2.技能目标:(1)能够使用C语言编写简单的网络聊天室程序;(2)能够分析和解决网络编程中的基本问题;(3)能够运用所学知识,独立完成网络编程项目。
3.情感态度价值观目标:(1)培养学生对网络编程的兴趣和热情;(2)培养学生团队协作和自主学习的能力;(3)培养学生具备良好的网络编程道德和法律法规意识。
二、教学内容本课程的教学内容主要包括以下几个部分:1.网络聊天室的基本概念和原理:介绍网络聊天室的定义、功能和应用场景。
2.C语言在网络编程中的应用:讲解C语言在网络编程中的基本方法,如Socket编程、TCP/IP协议等。
3.网络编程实践:通过案例教学,让学生动手编写网络聊天室程序,培养实际操作能力。
4.项目实践:学生分组完成网络编程项目,提高团队协作和解决实际问题的能力。
三、教学方法为了提高教学效果,本课程将采用以下教学方法:1.讲授法:讲解网络聊天室的基本概念、原理和方法。
2.案例分析法:分析典型网络聊天室程序,让学生了解实际应用。
3.实验法:让学生动手编写网络聊天室程序,培养实际操作能力。
4.讨论法:分组讨论项目实践中的问题,提高团队协作和解决问题的能力。
四、教学资源为了支持教学内容和教学方法的实施,我们将准备以下教学资源:1.教材:《C语言网络编程教程》等。
2.参考书:《网络编程技术手册》、《TCP/IP协议详解》等。
3.多媒体资料:网络聊天室程序示例、教学视频等。
4.实验设备:计算机、网络设备等。
五、教学评估本课程的教学评估将采用多元化的评价方式,全面客观地评价学生的学习成果。
成绩南京工程学院通信工程学院课程设计说明书(论文) 题目网络聊天室的设计课程名称通信应用软件课程设计专业多媒体通信班级媒通111学生姓名张瑜学号 208110515设计地点信息楼C-216指导教师耿鹏设计起止时间:2013年11月2日至2013年11月6日目录1.概述............................................... 错误!未定义书签。
2.设计介绍.. (5)2.1功能描述 (5)2.2流程图 (6)3.程序实现(关键代码解释) (10)4.功能演示(说明) (13)5.总结与展望 (14)6.参考文献.......................................... 错误!未定义书签。
61.概述1.1系统概述Linux是一种针对PC计算机和工作站得操作系统。
他具有像Windows和Mac 那样的功能齐全的图形用户界面。
由于Linux的开源的特点,越来越多的人转而使用Linux作为PC机得操作系统。
Linux系统支持三种并发方式:多进程、多线程、以及I/O多路复用。
而多线程技术是并行技术中开销较小,效率较高的一种方式,与其他两种方式相比,线程占用更少的系统资源,而且效率更高,是并发技术中最常用的方式。
网络聊天程序是目前应用极为广泛的一种网络软件,对于方便人们的交流沟通非常有效,同时,作为一种典型的网络应用,编写网络聊天程序是学习基于Linux的网络编程的有效方法。
服务器端:循环等候客户连接请求,一旦有客户连接请求,开启一个子线程接受并处理客户请求,接受来自客户的信息。
然后将客户信息反转后再返回给客户端。
主线程继续等待其他客户请求。
服务器具有同时处理多个用户的能力。
客户端:首先与服务器建立连接,然后向服务器发送数据进行交互,接受服务器的反馈信息并显示,之后继续等待用户输入直至用户输入ctrl+D结束通信。
客户端接到输入ctrl+D后,客户端关闭连接并退出。
tcp聊天室课程设计一、课程目标知识目标:1. 学生能理解TCP协议的基本原理,掌握聊天室建立过程中涉及的网络通信知识。
2. 学生能掌握网络编程中Socket的使用,了解基于TCP的客户端和服务器通信过程。
3. 学生了解数据传输过程中编码和解码的重要性,并掌握相关方法。
技能目标:1. 学生能运用所学知识,独立编写简单的TCP聊天室程序。
2. 学生具备调试和排查网络通信中可能出现的问题的能力。
3. 学生能够通过实际操作,体验网络编程的过程,提高实际动手能力。
情感态度价值观目标:1. 学生通过学习,培养对网络通信技术的兴趣,激发探索计算机网络世界的热情。
2. 学生在团队协作中,学会与他人沟通、分享和合作,培养良好的团队精神。
3. 学生认识到网络技术在实际应用中的价值,增强对所学知识的认同感和自信心。
课程性质分析:本课程为计算机网络编程实践课,注重理论与实践相结合,强调学生的动手操作能力和问题解决能力的培养。
学生特点分析:本年级学生具备一定的编程基础和网络知识,对新鲜事物充满好奇心,喜欢探索和实践。
教学要求:1. 教学内容与实际应用紧密结合,提高学生的学习兴趣和积极性。
2. 注重培养学生的动手操作能力和团队协作能力。
3. 教师应关注学生的个体差异,提供有针对性的指导,确保每位学生都能达到课程目标。
二、教学内容1. TCP协议原理:讲解TCP协议的特点、三次握手建立连接的过程、四次挥手断开连接的过程,结合教材相关章节,让学生深入理解TCP协议的工作机制。
2. 网络编程基础:介绍Socket编程的基本概念、类型和方法,以教材中网络编程章节为基础,让学生掌握基于TCP的客户端和服务器编程方法。
3. 聊天室程序设计:详细讲解聊天室程序的设计思路、功能模块划分,以及各模块的实现方法,结合教材案例,让学生学会编写简单的聊天室程序。
4. 数据传输与编码:分析聊天室中文字、表情等数据的传输过程,讲解编码和解码的方法,以教材相关内容为参考,让学生掌握数据传输中的编码和解码技巧。
基于TCP协议编程的网络聊天室设计容:基于TCP协议编程的方式,编写程序模拟网络聊天室的运行过程。
设计要求:1. 采用C/S模式,基于TCP协议编程的方式,使得各个用户通过服务器转发实现聊天的功能。
2. 分为两大模块:客户端模块和服务器端模块。
3. 客户端模块的主要功能:1)登陆功能:用户可以注册,然后选择服务器登入聊天室。
2)显示用户:将在线用户显示在列表中。
3)接收信息:能接收其他用户发出的信息。
4)发送信息:能发出用户要发出的信息。
4.服务器端模块的主要功能:1)检验登陆信息:检查登陆信息是否正确,并向客户端返回登陆信息,如信息正确。
就允许用户登陆。
2)显示在线状态:将该用户的状态发给各在线用户。
3)转发聊天信息:将消息转发给所有在线的用户。
5. 编程语言不限。
一、需求分析此程序主要分为两部分:服务器端和客户端。
服务器端用于提供一个网络端口,等待客户端发出请求,登录到此服务端,然后进行网络通讯和消息的转发;客户端可通过服务器端的IP地址发送连接请求,然后登陆聊天室。
在服务器端的成员列表栏中会显示在线的所有人,有人退出聊天室,成员列表会自动除名。
整个程序的主体使用了CSocket类的方法,实现了网络通讯聊天。
整个程序设计为两个部分:服务器(SpeakerServer)和客户端(SpeakerClient) 。
多人聊天的关键在于要将每个客户端发送过来的消息分发给所有其他客户端,为了解决这个问题,在服务器程序中建立一个套接口链表,用来保存所有与客户端建立了连接的服务端口。
设计原理:服务器通过socket()系统调用创建一个Socket数组后(设定了接受连接客户的最大数目),与指定的本地端口绑定bind(),就可以在端口进行侦听listen()。
如果有客户端连接请求,则在数组中选择一个空socket,将客户端地址赋给这个socket,然后登陆成功的客户就可以在服务器上聊天了。
客户端程序相对简单,只要建立一个socket与服务器端连接,成功后通过这个socket来发送和接收就可以了。
基于TCP协议编程的网络聊天室设计内容:基于TCP协议编程的方式,编写程序模拟网络聊天室的运行过程。
设计要求:1. 采用C/S模式,基于TCP协议编程的方式,使得各个用户通过服务器转发实现聊天的功能。
2. 分为两大模块:客户端模块和服务器端模块。
3. 客户端模块的主要功能:1)登陆功能:用户可以注册,然后选择服务器登入聊天室。
2)显示用户:将在线用户显示在列表中。
3)接收信息:能接收其他用户发出的信息。
4)发送信息:能发出用户要发出的信息。
4.服务器端模块的主要功能:1)检验登陆信息:检查登陆信息是否正确,并向客户端返回登陆信息,如信息正确。
就允许用户登陆。
2)显示在线状态:将该用户的状态发给各在线用户。
3)转发聊天信息:将消息转发给所有在线的用户。
5. 编程语言不限。
一、需求分析此程序主要分为两部分:服务器端和客户端。
服务器端用于提供一个网络端口,等待客户端发出请求,登录到此服务端,然后进行网络通讯和消息的转发;客户端可通过服务器端的IP地址发送连接请求,然后登陆聊天室。
在服务器端的成员列表栏中会显示在线的所有人名单,有人退出聊天室,成员列表会自动除名。
整个程序的主体使用了CSocket 类的方法,实现了网络通讯聊天。
整个程序设计为两个部分:服务器(SpeakerServer)和客户端(SpeakerClient) 。
多人聊天的关键在于要将每个客户端发送过来的消息分发给所有其他客户端,为了解决这个问题,在服务器程序中建立一个套接口链表,用来保存所有与客户端建立了连接的服务端口。
设计原理:服务器通过socket()系统调用创建一个Socket数组后(设定了接受连接客户的最大数目),与指定的本地端口绑定bind(),就可以在端口进行侦听listen()。
如果有客户端连接请求,则在数组中选择一个空socket,将客户端地址赋给这个socket,然后登陆成功的客户就可以在服务器上聊天了。
客户端程序相对简单,只要建立一个socket与服务器端连接,成功后通过这个socket来发送和接收就可以了。
服务器端功能:1、初始化socket,创建服务器端。
2、维护一个链表,保存所有用户的IP地址,端口信息。
3、接受用户传送来的聊天信息,然后向链表中的所用用户转发。
4、接受用户传送来的连接判断命令,并向用户发出响应命令。
客户端功能:客户端界面上的两个文本框,一个用于显示接受的聊天信息,一个用来接受用户输入的聊天信息。
当按下“发送”按钮时将信息发送给服务器。
一、概要设计:服务器客户端(设计流程图)二、详细设计:服务器端:1、启动服务器代码://服务器启动时,先创建套接字并绑定端口,再监听此端口。
void CSpeakerServerDlg::OnBnClickedStart(){UINT uPort = GetDlgItemInt(IDC_PORT);//创建套接字if ( !m_TCPSocketListen.Create(uPort) ){m_TraceRichEdit.TraceString(TEXT("绑定监听端口失败,请确认该端口没有被其它程序占用"),TraceLevel_Warning);return;}//监听套接字if( !m_TCPSocketListen.Listen() ){m_TraceRichEdit.TraceString(TEXT("监听失败"),TraceLevel_Warning);return;}UINT uMaxConnect = GetDlgItemInt(IDC_MAX);//设置接口m_TCPSocketListen.SetTCPSocketService(this);//更新界面m_TraceRichEdit.TraceString(TEXT("服务器启动成功"),TraceLevel_Normal);GetDlgItem(IDC_START)->EnableWindow(FALSE);GetDlgItem(IDC_STOP)->EnableWindow(TRUE);}2、监听端口,收到连接请求,接受的代码://先检验是否在服务器的最大连接限制内,若在,则获取当前客户的IP地址和端口等信息,插入链表中。
//为什么要限制连接人数?因为TCP连接是相当占资源的,若不限制连接人数,服务器的资源不够分配。
void CSpeakerServerDlg::OnAccept(){//承载能力if ( m_TCPSocketItemMap.size() > GetDlgItemInt(IDC_MAX) ){m_TraceRichEdit.TraceString(TEXT("服务器承载人数已满,已过滤其他连接"),TraceLevel_Warning);return;}//绑定套接字CTCPSocketService *pTCPSocketConnect = new CTCPSocketService;try{SOCKADDR_IN SocketAddr;int nBufferSize = sizeof(SocketAddr);//连接m_TCPSocketListen.Accept(*pTCPSocketConnect,(SOCKADDR *) &SocketAddr,&nBufferSize);if (pTCPSocketConnect->m_hSocket == INVALID_SOCKET) throw TEXT("无效的连接套接字");//获取客户端IPpTCPSocketConnect->m_dwClientAddr = SocketAddr.sin_addr.S_un.S_addr;pTCPSocketConnect->SetTCPSocketService(this);//绑定数据bool bActive = true;CTCPSocketItemMap::iterator iter = m_TCPSocketItemMap.begin();for (;iter!= m_TCPSocketItemMap.end();iter++){if ( pTCPSocketConnect->m_hSocket == iter->first ){bActive = false;break;}}//插入客户数据if ( bActive ){tagBindParameter *pBindParameter = new tagBindParameter;pBindParameter->pTCPSocketService = pTCPSocketConnect;pBindParameter->dwUserID = 0;m_TCPSocketItemMap.insert(pair<SOCKET,tagBindParameter*>(pTCPSocketConnect->m_h Socket,pBindParameter));}}catch (...){if (pTCPSocketConnect->m_hSocket != INVALID_SOCKET)pTCPSocketConnect->Close();}}3、接收并检验数据的代码:void CSpeakerServerDlg::OnReceive(SOCKET hSocket){BYTE cbDataBuffer[SOCKET_TCP_BUFFER];CTCPSocketItemMap::iterator iter = m_TCPSocketItemMap.find(hSocket);if ( iter == m_TCPSocketItemMap.end() ) return;//接收数据iter->second->pTCPSocketService->Receive(cbDataBuffer,CountArray(cbDataBuffer) );//解析数据TCP_Command * pCommand=(TCP_Command *)cbDataBuffer;//解释数据WORD wPacketSize = pCommand->wPacketSize;WORD wDataSize = wPacketSize-sizeof(TCP_Command);//数据包效验if ( wPacketSize > SOCKET_TCP_BUFFER+sizeof TCP_Command ){m_TraceRichEdit.TraceString(TEXT("数据包太大,已拒绝"),TraceLevel_Warning);return;}//子消息处理事件if( !OnEventTCPSocketRead(hSocket,pCommand->wMainCmdID,pCommand->wSubCmdID, pCommand+1,wDataSize) ){BYTE * pClientIP=(BYTE *)&iter->second->pTCPSocketService->m_dwClientAddr;m_TraceRichEdit.TraceString(TraceLevel_Warning,TEXT("收到伪数据包或未处理的数据包,wMainCmdID:%d,wSubCmdID:%d,来源IP:%d.%d.%d.%d"),pCommand->wMainCmdID,pCommand->wSubCmdID,pClientIP[0],pClientIP[ 1],pClientIP[2],pClientIP[3]);return;}}4、群发登录消息和用户发送的消息代码://服务器收到客户的消息之后会将收到的消息发送给链表之中除了发送客户之外的所有客户。
bool CSpeakerServerDlg::OnEventTCPSocketRead( SOCKET hSocket,WORD wMainCmdID, WORD wSubCmdID, VOID * pData, WORD wDataSize ){//获取绑定套接字CTCPSocketItemMap::iterator iter = m_TCPSocketItemMap.find(hSocket);if ( iter == m_TCPSocketItemMap.end() ) return false;CTCPSocketService *pTCPSocketService = iter->second->pTCPSocketService;switch ( wMainCmdID ){case MDM_GP_LOGON:{if ( wSubCmdID == SUB_CS_LOGON ){//效验数据ASSERT( wDataSize == sizeof CMD_CS_LOGON );if ( wDataSize != sizeof CMD_CS_LOGON ) return false;//获取数据CMD_CS_LOGON *pUserLogon = (CMD_CS_LOGON*)pData;m_TraceRichEdit.TraceString(TraceLevel_Normal,TEXT("%s登陆服务器"),pUserLogon->szUserName);tagUserData *pUserData = new tagUserData;//随机给用户分配一个UserID,UserID一般存储于数据库中,是一个独一无二的数字,//一般在数据库表中设为主键,是整个游戏或者软件识别用户的唯一依据,这里我们没有涉及到数据库,暂时随机取一个数值代替//其次,我们应该通过数据库SQL语句查询或者存储过程等方法,或在数据库中做密码的效验也好,//或在查询到用户的密码在服务器中进行判断也好,不管什么方法,此处一般需要进行用户密码的效验,这样才可以判定用户是否可以登陆了pUserData->dwUserID = GetTickCount();_sntprintf_s(pUserData->szUserName,CountArray(pUserData->szUserName),pUserLogon->s zUserName);_sntprintf_s(pUserData->szPassWord,CountArray(pUserData->szPassWord),pUserLogon->sz PassWord);//更新绑定数据CTCPSocketItemMap::iterator iter = m_TCPSocketItemMap.find(hSocket);if ( iter != m_TCPSocketItemMap.end() )iter->second->dwUserID = pUserData->dwUserID;//群发登陆消息SendUserItem(NULL,pUserData);//发送在线用户CUserItemArray::iterator pUserItemSend =m_pUserManager->GetUserItemArray()->begin();for(;pUserItemSend!=m_pUserManager->GetUserItemArray()->end();pUserItemSend++ )SendUserItem(pTCPSocketService,pUserItemSend->second);//插入数据m_pUserManager->InsertUserItem(pUserData);return true;}}break;case MDM_GP_USER:{if ( wSubCmdID == SUB_CS_USERT_CHAT ){//获取数据CMD_CS_CHATMSG *pCHATMSG = (CMD_CS_CHATMSG*)pData;//这里其实需要做很多的效验,如dwSendUserID的有效性,字符串是否为空等,这里就不做这些效验了CMD_SC_CHATMSG _SC_CHATMSG;ZeroMemory(&_SC_CHATMSG,sizeof _SC_CHATMSG);//获取时间GetLocalTime(&_SC_CHATMSG.SystemTime);_sntprintf_s(_SC_CHATMSG.szSendUserName,CountArray(_SC_CHATMSG.szSendUserNa me),m_pUserManager->GetUserName(iter->second->dwUserID));_sntprintf_s(_SC_CHATMSG.szDescribe,CountArray(_SC_CHATMSG.szDescribe),pCHATM SG->szDescribe);SendDataBatch(MDM_GP_USER,SUB_CS_USERT_CHAT,&_SC_CHATMSG,sizeof_SC_CHATMSG);return true;}}break;}return false;}5、当服务器端有人退出登录时的代码://客户端退出时,服务器端获取用户名并群发退出消息,再在链表中删除该用户的数据,清理他的Socketvoid CSpeakerServerDlg::OnClose(SOCKET hSocket){CTCPSocketItemMap::iterator iter = m_TCPSocketItemMap.find(hSocket);if ( iter == m_TCPSocketItemMap.end() ) return;//获取用户m_TraceRichEdit.TraceString(TraceLevel_Normal,TEXT("%s退出了服务器"),m_pUserManager->GetUserName(iter->second->dwUserID));//删除用户CMD_DC_DELETE _DC_DELETE;ZeroMemory(&_DC_DELETE,sizeof _DC_DELETE);_sntprintf_s(_DC_DELETE.szUserName,CountArray(_DC_DELETE.szUserName),m_pUser Manager->GetUserName(iter->second->dwUserID));//群发消息SendDataBatch(MDM_GP_USER,SUB_SC_DELETE,&_DC_DELETE,sizeof_DC_DELETE);//销毁数据m_pUserManager->RemoveUserItem(iter->second->dwUserID);iter->second->pTCPSocketService->Close();SafeDelete(iter->second->pTCPSocketService);SafeDelete(iter->second);m_TCPSocketItemMap.erase(iter);}6、关闭服务器连接代码:void CSpeakerServerDlg::OnBnClickedStop(){//关闭监听套接字m_TCPSocketListen.Close();//关闭连接套接字CTCPSocketItemMap::iterator iter = m_TCPSocketItemMap.begin();for (;iter != m_TCPSocketItemMap.end(); ++iter){iter->second->pTCPSocketService->Close();SafeDelete(iter->second->pTCPSocketService);SafeDelete(iter->second);}//更新界面m_TraceRichEdit.TraceString(TEXT("服务器关闭成功"),TraceLevel_Normal);GetDlgItem(IDC_START)->EnableWindow(TRUE);GetDlgItem(IDC_STOP)->EnableWindow(FALSE);}7、退出服务器代码:void CSpeakerServerDlg::OnCancel(){if ( m_TCPSocketListen.m_hSocket != INVALID_SOCKET ){if ( AfxMessageBox(TEXT("确定退出服务器吗?其它所有用户将失去连接"),MB_YESNO|MB_ICONQUESTION) == IDYES ){CTCPSocketItemMap::iterator iter = m_TCPSocketItemMap.begin();for (;iter != m_TCPSocketItemMap.end(); ++iter){iter->second->pTCPSocketService->Close();SafeDelete(iter->second->pTCPSocketService);SafeDelete(iter->second);}}}__super::OnCancel();客户端:1、客户端登录://登陆消息LRESULT CSpeakerClientDlg::OnLogonMessage( WPARAM wParam,LPARAM lParam ){tagLogonInfo *pLogonInfo = (tagLogonInfo*)wParam;//关闭之前socketm_TCPScoketClient.Close();//初始化套接字if ( !m_TCPScoketClient.Create() ){SetTraceString(TEXT("套接字创建失败"));SafeDelete(pLogonInfo);return FALSE;}//创建连接if( m_TCPScoketClient.Connect(pLogonInfo->szServerAddr,pLogonInfo->nPort) == FALSE ){int nErrorCode = m_TCPScoketClient.GetLastError();if ( nErrorCode !=WSAEWOULDBLOCK ){SetTraceString(TEXT("连接服务器失败,错误码:%d"),nErrorCode);SafeDelete(pLogonInfo);return FALSE;}}//设置接口m_TCPScoketClient.SetTCPSocketService(this);//构建数据CMD_CS_LOGON UserLogon;ZeroMemory(&UserLogon,sizeof UserLogon);_sntprintf_s(UserLogon.szUserName,CountArray(UserLogon.szUserName),pLogonInfo->szUs erName);_sntprintf_s(UserLogon.szPassWord,CountArray(UserLogon.szPassWord),pLogonInfo->szPass Word);//发送登陆请求m_TCPScoketClient.SendData(MDM_GP_LOGON,SUB_CS_LOGON,&UserLogon,sizeof UserLogon);//设置界面SetTraceString(TEXT("连接服务器成功"));m_LogonDlg.PostMessage(WM_CLOSE);//清理数据SafeDelete(pLogonInfo);return TRUE;}2、客户端发送数据代码:void CSpeakerClientDlg::OnBnClickedSend(){//设置数据CMD_CS_CHATMSG _UserChat_Msg;ZeroMemory(&_UserChat_Msg,sizeof _UserChat_Msg);GetDlgItemText(IDC_EDITCHAT,_UserChat_Msg.szDescribe,CountArray(_UserChat_Msg.s zDescribe));//效验数据if ( _UserChat_Msg.szDescribe[0] == TEXT('\0') ){SetTraceString(TEXT("聊天内容为空,请先输入您想说的话"));return;}//发送数据m_TCPScoketClient.SendData(MDM_GP_USER,SUB_CS_USERT_CHAT,&_UserChat_Msg, sizeof _UserChat_Msg);}3、客户端接收数据代码://客户端接收数据和服务器段类似,也需解析、检验void CSpeakerClientDlg::OnReceive( int nErrorCode ){//接收消息BYTE cbDataBuffer[SOCKET_TCP_BUFFER];m_TCPScoketClient.Receive(cbDataBuffer,CountArray(cbDataBuffer) );//解析数据TCP_Command * pCommand=(TCP_Command *)cbDataBuffer;//解释数据WORD wPacketSize = pCommand->wPacketSize;WORD wDataSize = wPacketSize-sizeof(TCP_Command);//数据包效验if ( wPacketSize > SOCKET_TCP_BUFFER+sizeof TCP_Command ){SetTraceString(TEXT("数据包太大,已拒绝"));return;}//子消息处理事件if( !OnEventTCPSocketRead(pCommand->wMainCmdID,pCommand->wSubCmdID,pComm and+1,wDataSize) ){SetTraceString(TEXT("收到未处理的数据包,wMainCmdID:%d,wSubCmdID:%d"),pCommand->wMainCmdID,pCommand->wSubCmdID);return;}}4、客户端消息的显示代码://显示的消息类型:当用户登录时,将用户数据插入用户列表中。