C++毕业设计——基于 C+++TCP+Websocket的即时通信系统设计与实现(毕业论文+程序源码)——即时通信系统

news2026/3/16 16:50:48
基于 CTCPWebsocket的即时通信系统设计与实现毕业论文程序源码大家好今天给大家介绍基于 CTCPWebsocket的即时通信系统设计与实现文章末尾附有本毕业设计的论文和源码下载地址哦。需要下载开题报告PPT模板及论文答辩PPT模板等的小伙伴可以进入我的博客主页查看左侧最下面栏目中的自助下载方法哦文章目录基于 CTCPWebsocket的即时通信系统设计与实现毕业论文程序源码1、项目简介2、资源详情3、关键词4、毕设简介5、资源下载1、项目简介随着网络通信和计算机技术的发展人们越来越希望能够即时发送和接收互联网消息。与此同时随着互联网的发展在HTML5中提出了websocket协议能更好的节省服务器资源和带宽并且服务器和浏览器能够双向实时通讯。为了能让用户体验传统客户端和web带来的即时通信结合的超爽体验本次毕业设计将完成web端和客户端之间的即时通信系统并利用在大学所学的知识打造高性能高并发高可拓展性服务器。同时更是为了方便人们之间的信息交流让用户随时的接入即时通信提升人们生活的效率。该按照软件工程思想采用面向对象和模块化设计方法设计。其中采用了网络通信技术、数据库技术多线程技术和信息安全技术的基础上设计并实现新型即时通信系统。该系统为用户提供点对点私聊群聊离线消息消息提示于一体的即时通信平台。2、资源详情项目难度中等难度适用场景相关题目的毕业设计配套论文字数11698个字45页包含内容全套源码配整论文3、关键词即时通信高性能高并发TCP/IPWebsocket4、毕设简介提示以下为毕业论文的简略介绍项目完整源码及完整毕业论文下载地址见文末。第一章 引言1.1 即时通信系统基本概念即时通信Instant Messaging缩写为 IM是以互联网为基础实现交互双方文字、图片、视频、语言等信息实时传输。即时通信系统的最大特点就是能在网络上进行信息之间的实时交流。与之间交流、电话交流等通信方式相比即时通信具有迅速、方便、隐蔽性强等特点在网络上可以超越身份、年龄、行业、地域等限制达到人与人之间的交流零距离实时通信成为互联网时代人与人沟通的重要方式[1]。1.2 即时通信系统的发展历程随着互联网发展即时通信系统在中国发展是非常迅速的。从1999年2月第一次推即时通信软件OICQ即时通信在中国的发展已有16年左右历史。经历萌芽阶段后即时通信在我国已经进入了迅速发展阶段。目前主要的即时通信产品主要有腾讯QQ、淘宝旺旺、飞秋、微软MSN、网易泡泡、百度Hi等。随着科技的发展即时通信系统的功能日益丰富即时通信不再只是即时交流简单文本内容它已经发展成集娱乐、交流、电子商务、办公合作和知识共享等为一体的综合信息平台。它以迅速、低成本和方便等特点被越来越被人们所接受即时通信成为互联网发展的趋势[1]。1.3 系统研究目的和意义随着网络通信技术和计算机技术的发展人们越来越希望能够快速得发送和接收互联网消息服务器管理员也希望减轻服务器的负担。与此同时随着互联网的发展在HTML5中提出了websocket协议能更好的节省服务器资源和带宽并且服务器和浏览器能够双向实时通讯。同时也是学习和实践网络编程、操作系统、软件工程、数据库概论、算法等相关知识。为了能让用户体验传统客户端和web带来的即时通信结合的超爽体验并利用在大学所学的知识打造高性能高并发高可拓展性服务器。同时更是为了方便人们之间的信息交流让用户随时的接入即时通信提升人们生活的效率。1.4 系统可行性分析省略第二章 相关技术介绍2.1 TCP/UDP协议TCP—传输控制协议,提供的是面向连接、可靠的字节流服务。在传输数据之前必须建立连接数据传输结束后要释放连接。TCP提供超时重发读取数据的次序一致丢弃重复数据检验数据流量控制等功能保证数据的可靠传输。UDP—用户数据报协议主要特点无连接、尽最大努力交付、面向报文、没有拥塞控制、支持一对一、一对多、多对一、多对多的交互通信、头部开销较小。在传输数据之前不需要建立连接。原地主机的运输层在收到UDP数据报后不需要给出任何确认。虽然UDP不提供可靠传输但在某些情况下确实一种最有效的工作方式。Socket是应用层与TCP/IP协议族通信的中间软件抽象层它是一组接口。在设计模式中Socket其实就是一个门面模式它把复杂的TCP/IP协议族隐藏在Socket接口后面对用户来说一组简单的接口就是全部让Socket去组织数据以符合指定的协议[3]。2.2 WebSocket协议WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455WebSocketAPI被W3C组织定为标准能更好的节省服务器资源和带宽并且服务器和浏览器之间能够实时双向通信。使用websocket的话浏览器只需一个TCP连接即可完成双向通行在服务器和浏览器频繁通信时TCP连接可以得到高效应用编程模型也十分简洁。Websocket协议主要分为两个部分握手和数据传输。浏览器建立连接时通过HTTP发起请求报文与普通HTTP请求协议略有区别在于协议头upgradewebsocketconnectionupgrade表示请求服务器升级协议为websocket。一旦websocket握手成功当前连接将不在进行HTTP的交互而是开始websocket的数据帧协议实现浏览器和服务器的数据交互[4]。图2.1 websocket 协议升级示意图2.3 服务器模型省略2.4 TLS/SSL协议SSLSecure Sockets Layer安全套接层是Netscape开发出来的用来保障网络传输数据时的安全性。TLS与SSL先在握手阶段采用RSA非对称之后的数据传输在传输层对网络连接进行加密。TLS/SSL是个公钥/私钥的结构它是一个非对称的结构每个服务器和客户端都有自己的公私钥。它建立在可靠的TCP传输协议之上为高层协议提供数据封装、压缩、加密等基本功能的支持,用于在真正的数据传输开始前连接的双方进行身份认证、协商加密采用的算法、交换加密采用的密钥等[3]。2.5编程语言2.5.1 CC起源与C语言最初的名字为C with Class意为带类的C语言。在《Effective C》一书中的条款一中将C视为一个语言联邦[6]。C可以看成由四个部分组成1 C。C以C为基础。预处理器(preprocessor)、数组(arrays)、指针(pointers)、自己分配内存、自己管理内存等都来自C。2 面向对象。类(class)、继承(inheritance)、封装(encapsulation)、多态(polymorphism)、虚函数(virtual function)等都是面向对象设计在C上的最直接的体现。3 模板。C的范型编程(generic programming)部分。他们带来新的编程范型(programming paradigm)也就是所谓的template meta programming(TMP模板元编程)。4 STL。即template程序库对容器、迭代器、算法以及函数对象的规约有极佳的紧密配合与协调。C11标准包括大量的新特性包括右值引用、lambda表达式、常量表达式、类型推导关键字auto、decltype函数因子、定则表达式哈希表、多线程、随机数引擎等[7]。2.5.2 NodejsNode.js是一个基于V8引擎的JavaScript运行时建立的平台用于高效率地搭建快速响应、高性能、高并发的网络应用。Node.js 使用事件驱动非阻塞异步的I/O 模型而得以轻量和高效非常适合在分布式设备上运行的数据流动密集型的实时应用。Node.js采用C语言编写而成它不是Javascript应用而是一个服务器端的Javascript的运行环境。[4]。图2.2 浏览器与Node.js以及CommonJS组织、W3C组织、ECMAScript之间的关系2.6 开源库2.6.1 Boost C LibrariesBoost库是一个可移植、提供源代码的C库作为标准库的后备是C标准化进程的开发引擎之一。 Boost库由C标准委员会库工作组成员发起其中有些内容有望成为下一代C标准库内容。在C社区中影响甚大是不折不扣的“准”标准库。Boost由于其对跨平台的强调对标准C的强调与编写平台无关[8]。2.6.2 OpensslOpenSSL 是一个强大的开源SSL\TLS安全套接字层密码库包括主要的密码算法如RSAAES,DES、生成数字证书封装管理功能及SSL协议的实现并提供丰富的测试程序和示例程序。[10][11]。2.6.3 ProtobufProtocol Buffers 是一种轻便高效的结构化数据存储格式库可以用于结构化数据序列化可以根据预定义的消息类型生成高效的程序文件很适合做性能要求很高的数据存储或数据交换格式。它广泛于自定义通讯协议、数据存储等领域的平台无关、语言无关、可扩展的序列化结构数据传输格式。目前提供了 C、Python 、Nodejs、Java几种语言的接口[9]。2.6.4 Hiredishiredis是redis数据库的C接口,原开源库只支持Linux。在通过宏判定修改hiredis的网络接口后能够支持windows[12]。异步连接通过adapter使用libevent。2.6.5 Socket.ioSocket.io是一个开源的高效WebSocket库它通过Node.js实现WebSocket服务端库同时也提供客户端javascript库。Socket.io库支持以事件驱动为基础的双向实时通信它兼容各种浏览器或移动设备。Socket.io支持4种协议Websocket、jsonp-polling 、xhr-polling、htmlfile它会自动根据浏览器选择适合的连接方式从而让开发者可以着重于功能逻辑而不是平台的兼容性问题 [13]。安装方式: npm install socket.io –g。2.7 开发相关工具2.7.1 RedisRedis是一个key-value高速缓存数据库它每秒操作次数能高达十万次。和Memcached缓存数据库类似它支持存储的value数据类型非常丰富包括list(链表)、string(二进制字符串)、set(集合)、zset(有序集合)和hash哈希表类型存储的数据可以以二进制数据存储。这些数据类型都支持push/pop、lrange、Sadd及取交集并集和差集及更丰富的数据操作而且这些操作都是原子操作也支持多操作的原子性操作。支持发布及订阅功能为系统提供低耦合的交互模式。与memcached一样为了保证高性能数据库数据都是缓存在运行内存中。区别的是redis会周期性的把数据以快照的方式写入本地磁盘以实现持久化数据并且在此基础上实现了master-slave(主从)同步[14]。2.7.2 SqliteSqlite是一个轻量级的数据库是遵守ACID的关系型数据库原理的系统它以C语言实现非常高效。它是D.RichardHipp建立的开源项目。它的设计目标是能够嵌入到使用的软件中而且目前已经广泛应用在很多软件产品它占用内存资源非常的低只需要占用几百K字节的内存[16][17]。2.7.3 NginxNginx (“engine x”) 是一个著名的开源高性能的 HTTP 和反向代理服务器它使用C语言开发网络库使用libevent性能高效代码结构优良其源代码以类BSD许可证的形式发布。因它的高稳定性、高性能、丰富的操作功能、示例配置文件和低系统资源的占用而闻名渐渐成为高性能网站使用比例最高的web服务器[15][18]。2.7.4 Visual Studio 2013Microsoft Visual Studio简称VS是美国微软公司强大的开发语言工具包系列产品。VS是一个功能丰富的开发工具如代码提示、良好的错误提示、代码管控工具、UML工具、集成开发环境(IDE)等等。在最新的VS2013版本中支持了大部分C11标准实现新增了代码信息指示、Git版本控制支持还有单元测试支持等。2.7.5 Visio 2013Visio是一款需求分析、系统设计和流程进行可视化软件。对UML统一建模语言很好的支持同时也包含有很多行业可视化工具为人们更好的表达设计思路和想法提高工作生活的效率。第三章 即时通信系统的设计3.1 即时通信系统功能描述随着web的发展在HTML5标准中提出了Websocket protocol协议。它实现了浏览器与服务器全双工通信(full-duplex)。为用户提供能够通过客户端和web端接入的即时通信平台让用户体验传统客户端和HTML5标准结合带来的超爽体验方便人们之间的信息交流创建新型沟通文化提升人们生活的效率。该系统具有私聊群聊消息通知、离线消息存储上下线通知等基本功能同时保证数据通信的即时性以及通信过程和消息存储的安全性。图3.1 用户用例图3.2系统总体设计TCP服务器和客户端采用C编写通过TCP协议与服务器连接并由SSL安全传输层保证安全实现即时通信。浏览器端通过HTML5中提出的Websocket协议与服务器连接Websocket服务器和HTTP服务器采用Nodejs编写。不同物理服务器不同语言服务器采用统一的数据传输格式来传输借助redis数据库的Pub/Sub模式和消息队列来进行服务器之间的信息通信。对数据库进行Master/Salve备份。图3.2 服务器设计图3.3数据库设计为了提高对数据的处理采用缓存数据库Redis。Redis是一个Key-Value数据库数据库设计主要体现在Key的设计。存储的数据是二进制安全的。3.4主要的消息时序图3.4.1 未读消息时序图1用户登陆后发出未读消息请求。2 查询unread列表所有私聊未读消息。如LRANGE unread:14006 0 -13向Response添加未读消息。4查询所有群未读消息。如SORT groupSet:14006 GET # GET unreadNumber:14006:*5向Response添加未读消息。6对Response序列化发送消息。3.4.2点对点私聊时序图图3.3 点对点聊天时序图1, 一个用户发出一条点对点聊天消息。2, 消息服务器接收到Peer消息判断是否在当前服务器。3, 如果接收的用户在当前服务器向接收者的连接发送消息如果用户不在当前服务器查询用户状态。如EXIST online:140064, 接收数据库查询结果判断对方是否离线。5, 如果对方离线将二进制消息保存到对方未读消息列表如果对方在线根据返回结果得知对方Socket信息向其Publish PeerMsg 二进制数据。6, 其他服务器Publish 一条PeerMsg消息。A, 订阅到一条PeerMsg:address:port消息判断对方是否在服务器上。B, 如果用户在服务器上向其发送Peer消息如果用户不在服务器将二进制消息保存到对方未读消息列表。一般用户是会在服务器上的防止发布消息的时候用户退出的情况。3.4.3群聊消息时序图图3.4 群聊天时序图1, 一个用户发出一条群聊天消息。2, 消息服务器接收到一条群消息向数据库查询群成员信息。如SORT onlineGroup:1 by no_exist_key get # get online:*3, 获取到群当前在线人员信息。4, 向本服务器的在线用户发送群消息向其他服务器Publish包含用户ID列表和群消息的数据将消息推入消息列表如LPUSH groupMsg:1 二进制数据获取群成员和在线成员的差集SDIFF groupMember:1 onlineGroup:1更改未在线用户群消息未读数目如INCR unreadNumber:14006:1A, 其他服务器Publish groupMsg消息包含用户ID列表和群消息。B, 订阅到一条groupMsg消息向用户ID列表中的用户发送群消息。3.5网络处理设计基于TCP协议为什么需要对数据进行封包和拆包TCP是个面向可靠传输协议就是没有边界的一串数据,就像河里面的水一样是连续的其间没有分界线[22]。传输时出现粘包的原因有 开启Nagle算法后发送端需要等待缓冲区满才发送出去造成粘包接收方系统繁忙没有及时接收缓冲区的包造成多个包连续等原因。假设我们连续调用两次send分别发送两段数据data1和data2,在接收端有可能出现以下几种接收情况A.先接收到data1,然后接收到data2。B.先接收到data1的部分数据,然后接收到data1余下的部分以及data2的全部。C.先接收到了data1的全部数据和data2的部分数据,然后接收到了data2的余下的数据。D.一次性接收到了data1和data2的全部数据。对于A这种情况正是我们需要的,对于B,C,D的情况就是大家经常说的粘包,就需要我们把接收到的数据进行拆包,拆成一个个独立的数据包.为了拆包就必须在发送端进行封包。对于UDP来说就不存在拆包的问题,因为UDP是用户数据报协议,也就是数据包是一个一个发,接收端不保证包的次序和是否到达但能够确定一个UDP包是一个完整的消息。3.5.1封包封包就是给一段数据加上额外信息,使得在解析TCP数据时能够区分完整消息数据。由于消息是序列化成二进制数据进行传输所以包需要附带消息的类型,过滤非法包时封包会加入包尾内容如“\r\n”分隔符。图3.6 消息封包图3.5.2拆包TCP每次读取到分隔符”\r\n”时作为一个包判断读取头部网络字节序4 bytes数据,转换为本地字节序整数n判断缓冲区大小是否等于n4。如果相等则消费缓冲区n4个字节;如果不相等则不消费缓冲区。网络消息流程[20]图3.7 消息流程图1, 服务器异步读取数据接收到一个TCP流后回调HandleRead函数。向缓冲区Commit接收到的字节数n。2, 对缓冲区进行拆包循环判断缓冲区是否有完整包如果有调用ProtobufCodec的OnMessage函数如果没有跳出循环。开始接收下一个TCP流。3, OnMessage函数对缓冲区consume消费m个字节数对二进制数据解码生成对应的Message。4, 调用ProtobufDispatcher的OnProtobufMessage函数将消息映射到服务器相应的处理函数。5, 消息服务器对不同消息进行相应的处理。6, 如果消息需要其他服务器处理则Publish相应服务器消息如果用户在本服务器直接向其发送相应的消息。7, 对消息进行封包发送二进制数据。3.6负载均衡设计登陆服务器每次登陆后取加权集合serverRank权值最大的服务器信息对分配消息服务器的消息服务器进行加负权;用户退出后对分配的消息服务器加正权Web端通过配置Nginx来实现对Https和Websocket的负载均衡。3.7网络安全设计图3.8 网络安全连接图1, 客户端登录时采用TLS/SSL连接数字签名证书采用自签证证书登录时传输密码的MD5校验码。2, 登录服务器分配消息服务器和SessionID。3, 连接消息服务器时第一个消息包作为握手包不加密只包含用户ID。4, 如果数据库有用户登录记录返回成功。5, 两端用SessionID作为种子对以后要传输的数据进行AES加密。6, web端登录、拉取好友信息、群消息等用HTTPsTCP短连接。7, 聊天消息采用在HTTPS建立的websockets连接TCP长连接。第四章 即时通信系统的实现4.1主要类和文件说明Tcp_Server:服务器网络连接类。采用Boost Asio作为异步模型实现高性能网络服务器。监听端口、接收新的连接对每个连接创建新的Tcp_Session对象。Tcp_Session:网络连接Session类。接收、发送TCP流PING数据包错误处理消息接收到后交付ProtubufCodec处理[22]。Ssl_Server:安全传输层TLS/SSL服务器网络连接类。Ssl_Session:安全传输层TLS/SSL连接Session类。Connection_Manager:网络连接管理类。管理连接用户ID与连接的映射关系创建、退出时要处理的相关数据。MyBuffer:数据缓存区类。ProtubufCodec:网络消息封包和拆包及加密解密类。成员变量存储ProtubufDispatcher的HandleMessage函数。图4.1 ProtuCode类UML图ProtubufDispatcher:处理函数和不同消息类型之间映射类。它有一个 mapDescriptor*, ProtobufMessageCallback 成员通过registerMessageCallback 向Map表添加映射ProtubufCodec解码后调用HandleMessage找到回调函数如果没找到调用默认回调。图4.2 ProtubufDispatcher类UML图Credis与redis数据库操作类像管道多操作原子性等复杂操作通过返回redisContext来处理。Server:服务器核心类向ProtubufCodec,ProtubufDispatcher,tcp_server或ssl_server注册各种服务器处理回调消息的对应处理方式发布服务器间消息订阅服务器间消息操作数据库等操作对于数据处理处理函数使用互斥锁确保在多线程下的安全。图4.3 服务器启动和退出处理图SessionID.h密钥生成函数通过当前系统时间戳和C11的随机数生成引擎和正态分布生成15位长的密钥种子。DemoServer.h:消息服务器启动文件启动时接收服务器监听参数创建和运行io_service对象负责连接应用程序与操作系统的IO服务控制台事件(如Ctrl c,关闭控制台)的监听以及处理。LoginServer.h:登陆服务器启动文件。Message.pb.h:登录时与登录服务器连接消息类集合。MessageChat.h:登录后客户端和消息服务器消息类集合。MessageServer.h:消息服务器之间的订阅消息类集合。Node.js服务端由于Node.js采用C语言编写而成它不是Javascript应用而是一个Javascript的运行环境基于libuv跨平台网络库具有异步IO、事件驱动、单线程等特点。Websocket协议对TCP流封装成Frame数据包websocket库采用Socket.io数据传输采用JSON格式TCP连接采用Node.js内置库netHttps也采用内置库https。创建新的数据库用来对web端Session的高速存储以用户名作为作为关键字存储的内容是Session相关内容的JSON数据。包含SessionId、Session过期时间和最大生命周期。实现HTTP服务器重启后浏览器不需要重新登陆关键字生存周期为一周Session过期时间为30分钟Session过期后更新数据库和浏览器Session的内容。socket.jswebsocket服务器文件服务器启动和退出时流程与C服务器相同用于订阅发布消息、实时对聊天数据的处理、消息通知等实时通信操作。multiProcess.js由于Node.js是单进程单线程的通过进程间通信传递相关句柄实现Master-Worker模式主进程管理和调度工作进程的功能充分利用多核CPU资源。图4.4 Node.js服务器多进程示意图HttpsServer.jsHttps服务器文件用户登陆、退出、拉取好友信息、群信息、分组信息、用户信息等操作。其HTTPS数据接口如表4.1表4.1 HTTPS数据接口/data/groupMember?groupId1 群成员信息/data/friendsList 用户好友列表/data/unreadPeerMsg 所有好友未读消息data/groupsList 群列表信息/data/unreadGroupMsg 所有群未读消息图4.5 HTTPS数据接口效果图客户端和服务器很多文件公用:DlgGroups.h、DlgFriends.h含有主窗口Tab页好友列表、群列表窗口对话框类。DlgChat.h、DlgGroupChat.h含有点对点私聊、群聊天窗口对话框类。ClientDlg.h、DlgLogin.h含有主窗口、登录窗口对话框类。Web端路由设计/首页/user/userid用户主页/register用户注册页面/login用户登录页面/loginOut用户退出页面/Chat聊天页面/happyChat:无状态聊天页面可以创建临时匿名会话。client.js是websocket客户端的业务逻辑实现代码。Ca.crt、server.crt、client.crt为ca证书、服务器证书、客户端证书server.csr、client.csr为证书请求链ca.key、server.key、client.key为密钥。4.2系统部分截图图4.6 C服务器端启动控制台截图图4.7 Nodejs的HTTP服务器效果图图4.8 Nodejs的Websocket服务器启动效果图图4.9 C登录界面图4.10 web登录界面图4.11 Web注册界面图4.12 客户端登录后界面图4.13 Web端登录后界面第五章 即时通信系统的测试5.1测试目的和任务软件测试是对软件规格说明、软件设计和编码的最后复审目的是在软件产品交互之前尽可能发现软件中潜在的错误。大量统计数据表明软件测试成本往往占整个开发成本的1/3左右。随着人类对计算机的逐步深入人们对软件的要求也越来越高“不是人适应软件而是软件适应人”等观点已经成为人们的共识。测试是保证软件质量的重要手段也是软件设计与开发过程中必不可少的环节。本系统在开发期间对每个功能都进行了单元测试新的功能单元测试成功后才添加到系统都进行了集成测试集成测试成功后才进行下一个功能开发系统主要功能完成后对其进行了确认测试和系统测试。5.2测试流程I配置Nginx代理服务器实现对websocket的负载均衡配置redis数据库实现Master/Slave备份和其他配置npm install下载工程中package.json对应的Nodejs依赖库。II先4台开启C消息服务器1台开启登录服务器多个用户在不同机器上打开客户端之间并进行通信对功能测试用例进行测试观察服务器消息记录和消息流动。III开启Nodejs的HTTP服务器和Websocket服务器多个用户在不同机器上的浏览器之间相互通信对功能测试用例进行测试观察服务器消息记录和消息流动。IV同时开启C服务器和Nodejs服务器在不同的机器上打开客户端和浏览器两个用户之间一个使用客户端一个使用浏览器进行通信对功能测试用例进行测试观察不同服务器消息记录和消息流动。5.3 功能测试用例表5.1 功能测试用例index 功能模块 设计数据测试 预期结果 测试描述001 用户注册 填写未注册的用户 注册成功 进入登录界面002 用户注册 填写已注册用户 注册失败 提示用户已存在003 用户注册 填写的信息不合法 注册失败 提示填写信息格式不合法004 用户登录 用户ID和密码正确 登录成功 生成好友列表005 用户登录 用户已登录 登录失败 提示已登录006 用户登录 用户ID或密码错误 登录失败 提示用户ID或密码错误007 添加好友 查找的用户ID存在且不是自己的好友 添加成功 刷新好友列表008 添加好友 添加自己的用户ID 添加失败 提示自己不能添加自己009 添加好友 查找的用户ID已是用户好友 添加失败 提示已经加为好友010 添加好友 查找未注册用户ID 添加失败 提示找不到用户信息011 发送消息 消息不为空 发送成功 服务器接收到消息012 发送消息 消息为空 发送失败 提示消息不能为空5.4 测试结果图5.1 客户端之间点对点私聊天图5.2 客户端之间群聊天两个用户登录后分别连接8083和8084端口服务器二者相互聊天在服务器的信息,。如图5.3图5.3 在不同消息服务器上的聊天记录图5.4 不同浏览器之间即时通信效果图5.5 Websocket服务器消息记录图5.5 客户端与浏览器即时通信效果图6.6 客户端与浏览器聊天时C服务器记录图6.7 客户端与浏览器通信时Websocket服务器记录第六章 结论和展望6.1 结论本文主要讨论了基于TCP和Websocket协议的即时通信系统的研究和实现。研究不同协议类型服务器通过统一的服务器消息格式实现互通互联简单的负载均衡异步网络编程Publish/Subscribe设计模式实现了Web端与传统客户端之间即时通信服务器的高性能、高并发。本系统按照软件工程思想使用面向对象设计模式设计并封装了大量的类函数式编程方法解决异步编程的困难并采用多服务器协作的方式提高了服务器的健壮性和可拓展性。 在实现的过程中学习了多种网络协议。6.2 进一步工作的方向由于时间和能力有限基于TCP和Websocket协议的即时通信系统的还不是很完善系统的一些其他功能和细节需要进一步的改进和增强。需要继续完善的功能有① 增加文件传输、视频聊天、语音聊天、视频会议等功能。② 将C登录服务器也改为Https。③ 编写自己的消息队列服务器。本系统借助redis高速缓存数据库实现服务器间消息队列。④ 添加系统监控功能。由于时间和目前能力有限没有设计系统监控功能和日志记录只是简单输出在控制台界面。⑤ 对数据进行分布式存储。虽然服务器采用多物理机但设计是没有考虑对数据的分布式切割这对服务器的拓展性影响很大。⑥ 更改服务器数据传输类型。有些序列化的消息存储和传输通过二进制传输虽然性能好但可读性比较差可以将传输类型改为JSON数据。参考文献[1] 牛晓蕾. 基于 TCP/IP 协议的安全即时通信系统设计与实现[D]西安电子科技大学2007[2] 史济民顾明华邓红软件工程—原理方法与应用[M]北京高等教育出版社2009[3] 谢希仁计算机网络[M]北京电子工业出版社2007[4] 朴灵深入浅出Node.js[M]北京人民邮电出版社2013[5] 维基百科 websockethttp://zh.wikipedia.org/wiki/WebSocket2015-4-14[6] [美]Scott Meyers. Effective C[M].北京电子工业出版社. 2006-7[7] [美] Stanley BLippman[美] Josée Lajoie[美] Barbara E. Moo. C Primer 5th Edition[M]北京电子工业出版社2013[8] 百度百科 boost( C 库http://baike.baidu.com/subview/663725/10275011.htm2015[9] Google Protocol Buffer 的使用和原理. http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/ .2011[10] openssl. http://www.openssl.org/docs/.2015[11] 百度百科 openssl. http://baike.baidu.com/view/300712.htm. 2015[12] hiredis .https://github.com/redis/hiredis[13] socket.io. https://www.npmjs.com/package/socket.io. 2015[14] 黄健宏 Redis设计与实现[M]北京机械工业出版社2014[15] 百度百科 nginxhttp://baike.baidu.com/view/926025.htm2015[16] 百度百科 sqlite http://baike.baidu.com/view/19310.htm 2015[17] 王珊萨师煊.数据库系统概论第四版[M].北京:高等教育出版社2007[18] Nginx .http://nginx.org/en/docs/[19] 孙鑫. VC深入详解[M].北京电子工业出版社.2006[20] 在 muduo 中实现 protobuf 编解码器与消息分发器. http://www.cnblogs.com/Solstice/archive/2011/04/13/2014362.html#2982572. 2011[21] 一种自动反射消息类型的 Google Protobuf 网络传输方案.http://blog.csdn.net/Solstice/article/details/6300108 . 2011-04-03[22] 封包和拆包. http://blog.csdn.net/fengge8ylf/article/details/793808 .2006-06-03致谢省略5、资源下载本项目源码及完整论文如下有需要的朋友可以点击进行下载。如果链接失效可点击下方卡片扫码自助下载。序号毕业设计全套资源点击下载本项目源码基于 CTCPWebsocket的即时通信系统设计与实现源码文档_ C__即时通信系统.zip提示如果下载链接失效可点击下方卡片扫码自助下载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2416558.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…