当前位置: 首页 > article >正文

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

基于 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提示如果下载链接失效可点击下方卡片扫码自助下载。

相关文章:

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

基于 CTCPWebsocket的即时通信系统设计与实现(毕业论文程序源码) 大家好,今天给大家介绍基于 CTCPWebsocket的即时通信系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦。需要下载开题报告PPT模板及论文答辩PPT模板…...

Lumibot核心功能揭秘:股票、期权、期货一站式交易解决方案

Lumibot核心功能揭秘:股票、期权、期货一站式交易解决方案 【免费下载链接】lumibot Backtesting and Trading Bots Made Easy for Crypto, Stocks, Options, Futures, FOREX and more 项目地址: https://gitcode.com/gh_mirrors/lu/lumibot Lumibot是一款功…...

如何快速上手 runtimejs:轻量级 JavaScript 库操作系统完整指南

如何快速上手 runtimejs:轻量级 JavaScript 库操作系统完整指南 【免费下载链接】runtime [not maintained] Lightweight JavaScript library operating system for the cloud 项目地址: https://gitcode.com/gh_mirrors/runt/runtime runtimejs 是一个轻量级…...

如何使用img2css:将任何图片转换为纯CSS的终极指南

如何使用img2css:将任何图片转换为纯CSS的终极指南 【免费下载链接】img2css Convert any image to pure CSS. Recreates images using only box-shadows. 项目地址: https://gitcode.com/gh_mirrors/im/img2css img2css是一个创新工具,能够将任何…...

如何快速构建 Vue Music 音乐应用:从安装到部署的完整指南

如何快速构建 Vue Music 音乐应用:从安装到部署的完整指南 【免费下载链接】vue-music cloud-music(网易云音乐) 项目地址: https://gitcode.com/gh_mirrors/vuem/vue-music Vue Music 是一个基于 Vue.js 开发的现代化音乐播放应用,它模仿网易云音…...

ps4-exploit-host远程DNS使用教程:无需本地运行即可玩转漏洞利用

ps4-exploit-host远程DNS使用教程:无需本地运行即可玩转漏洞利用 【免费下载链接】ps4-exploit-host Easy Exploit Hosting 项目地址: https://gitcode.com/gh_mirrors/ps/ps4-exploit-host ps4-exploit-host是一款功能强大的PlayStation 4漏洞利用托管工具&…...

如何快速上手DetectAndTrack:CVPR18论文算法的完整实践指南

如何快速上手DetectAndTrack:CVPR18论文算法的完整实践指南 【免费下载链接】DetectAndTrack The implementation of an algorithm presented in the CVPR18 paper: "Detect-and-Track: Efficient Pose Estimation in Videos" 项目地址: https://gitcod…...

终极Keychron键盘设置指南:从入门到精通的实用技巧

终极Keychron键盘设置指南:从入门到精通的实用技巧 【免费下载链接】keychron Settings for Keychron keyboards 项目地址: https://gitcode.com/gh_mirrors/ke/keychron Keychron开源项目是针对Keychron键盘的设置工具,帮助用户在Linux系统上轻松…...

终极Android WebView缓存解决方案:CacheWebView开源项目完全指南

终极Android WebView缓存解决方案:CacheWebView开源项目完全指南 【免费下载链接】CacheWebView Custom implement Android WebView cache, offline website, let cahe config more simple and flexible 项目地址: https://gitcode.com/gh_mirrors/ca/CacheWebVi…...

揭秘DomainPasswordSpray:简单高效的域密码喷洒工具完全指南

揭秘DomainPasswordSpray:简单高效的域密码喷洒工具完全指南 【免费下载链接】DomainPasswordSpray DomainPasswordSpray is a tool written in PowerShell to perform a password spray attack against users of a domain. By default it will automatically gener…...

PySpace与GLSL深度整合:打造自定义分形着色器的终极指南

PySpace与GLSL深度整合:打造自定义分形着色器的终极指南 【免费下载链接】PySpace GLSL Fractal Ray Marcher in Python 项目地址: https://gitcode.com/gh_mirrors/py/PySpace PySpace是一个强大的Python项目,它将GLSL(OpenGL着色语言…...

java毕业设计下载(全套源码+配套论文)——基于javaEE+SSH+oracle的健康管理系统设计与实现

基于javaEESSHoracle的健康管理系统设计与实现(毕业论文程序源码) 大家好,今天给大家介绍基于javaEESSHoracle的健康管理系统设计与实现,更多精选毕业设计项目实例见文末哦。 文章目录: 基于javaEESSHoracle的健康管…...

asp毕业设计——基于asp+access的销售供应链管理系统设计与实现(毕业论文+程序源码)——供应链管理系统

基于aspaccess的销售供应链管理系统设计与实现(毕业论文程序源码) 大家好,今天给大家介绍基于aspaccess的销售供应链管理系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦。需要下载开题报告PPT模板及论文答辩PPT模…...

PPOCRLabel进行多语言语种的自动标注

需求需要标注法语。PPOCRLabel默认标注中文/英文。如果需要标注其他语种,需要修改代码。在PPOCRLabel.py中MainWindow的__init__中进行修改:self.lang "fr" # 加入法语标志params {"use_doc_orientation_classify": False,&qu…...

告别论文焦虑:从开题到答辩,AI如何提供一站式解决方案?

当查重、格式、AIGC检测三重压力叠加,一款真正懂学术的智能工具或许能成为你的毕业季“救命稻草”。 又到一年毕业季,图书馆、实验室、宿舍里,无数学生正面临学术生涯的重要关卡——毕业论文。从开题报告的反复修改,到文献综述的浩…...

如何使用BlindAI构建安全的隐私增强AI解决方案:完整指南

如何使用BlindAI构建安全的隐私增强AI解决方案:完整指南 【免费下载链接】blindai Confidential AI deployment with secure enclaves :lock: 项目地址: https://gitcode.com/gh_mirrors/bl/blindai BlindAI是一款基于安全飞地技术的隐私增强AI部署解决方案&…...

35岁前必建“技术护城河”:脏乱差模块防御学

第一章&#xff1a;脏乱差模块的识别与战略价值1.1 模块特征诊断矩阵代码腐化指标&#xff1a;循环复杂度>30、单元测试覆盖率<20%的祖传代码模块业务耦合陷阱&#xff1a;涉及多系统联动的支付对账、库存同步等核心链路接口文档黑洞区&#xff1a;仅存口头传承的业务规则…...

装傻生存艺术:如何让AI认定你是“濒危程序员”

AI时代的测试生存悖论在AI驱动的自动化测试生态中&#xff0c;测试工程师面临一个微妙挑战&#xff1a;过度展现技术能力可能触发AI系统的“竞争警报”&#xff0c;导致工具限制访问权限或误判操作意图&#xff1b;而完全隐藏专业性又将削弱职业价值。这一矛盾催生了“濒危程序…...

在技术债沼泽建城堡:让裁员成本高到绝望

在软件测试领域&#xff0c;技术债&#xff08;Technical Debt&#xff09;常被视为隐藏的沼泽——它悄无声息地累积&#xff0c;拖慢开发效率&#xff0c;增加系统风险。然而&#xff0c;聪明的测试从业者能将这片沼泽转化为坚固城堡&#xff0c;让裁员成本高到企业望而却步。…...

测试员的终极铠甲:把业务逻辑变成混沌迷宫

在软件测试领域&#xff0c;业务逻辑常被视为隐藏的战场&#xff1a;它既是测试员最强大的防护铠甲&#xff0c;能抵御上线后的灾难性缺陷&#xff1b;又是一座混沌迷宫&#xff0c;充满未知的规则交织与状态变迁。功能测试达标仅是起点&#xff0c;真正的高手懂得潜入业务逻辑…...

【Warp+Claude】任务完成自动通知(macOS + Warp 版)

本篇是macOS 适配版&#xff0c;针对 Warp 终端用户优化。 ​ 在 Warp 里让 Claude 跑任务&#xff0c;切到其他应用做自己的事。任务完成时 terminal-notifier 自动弹出 macOS 原生通知&#xff0c;你不需要盯着终端等。 一、环境说明 系统&#xff1a;macOS终端&#xff1a…...

简易CPU设计入门:内存读写(三)

专栏导航 上一篇&#xff1a;简易CPU设计入门&#xff1a;内存读写&#xff08;二&#xff09; 专栏目录 下一篇&#xff1a;无 项目代码下载 请大家首先准备好本项目所用的源代码。如果已经下载了&#xff0c;那就不用重复下载了。如果还没有下载&#xff0c;那么&#xf…...

前缀和(算法4)

1.一维前缀和模板 一维前缀和&#xff1a;快速求出数组某一连续区间的和 一维前缀和模板&#xff1a; 第一步&#xff1a;先预处理出一个数组 dp[i] dp[i-1]arr[i]//递推初始化dp dp[i]表示下标为[1, i]的所有数的和第二步&#xff1a;[r, l]区间和为dp[r]-d…...

简易CPU设计入门:内存读写(二)

专栏导航 上一篇&#xff1a;简易CPU设计入门&#xff1a;内存读写&#xff08;一&#xff09; 专栏目录 下一篇&#xff1a;简易CPU设计入门&#xff1a;内存读写&#xff08;三&#xff09; 项目代码下载 请大家首先准备好本项目所用的源代码。如果已经下载了&#xff0c…...

终极 EpubPress 客户端使用指南:解决常见问题的完整方案

终极 EpubPress 客户端使用指南&#xff1a;解决常见问题的完整方案 【免费下载链接】epub-press-clients &#x1f4e6; Clients for building books with EpubPress. 项目地址: https://gitcode.com/gh_mirrors/ep/epub-press-clients EpubPress 客户端是一款强大的开…...

【项目分享01】轿车信息管理系统(java/sql项目源码+运行过程详解)

轿车信息管理系统 &#xff08;直接点击上面的链接&#xff0c;即可免费下载文件&#xff09; 轿车信息管理系统运行过程详解Navicat操作过程&#xff1a;1.打开软件&#xff0c;新建mysql连接2.点击"mysql"选择"新建查询"vs操作过程&#xff1a;1.点击&qu…...

Rust数值编程新纪元:num库完全指南 — 从基础类型到高级数学运算

Rust数值编程新纪元&#xff1a;num库完全指南 — 从基础类型到高级数学运算 【免费下载链接】num A collection of numeric types and traits for Rust. 项目地址: https://gitcode.com/gh_mirrors/nu/num num库是Rust生态中强大的数值编程工具集&#xff0c;提供了丰富…...

html2jade实战教程:处理Mustache/Handlebars模板的最佳实践

html2jade实战教程&#xff1a;处理Mustache/Handlebars模板的最佳实践 【免费下载链接】html2jade Converts HTML to Jade template. Not perfect but useful enough for non-daily conversions. 项目地址: https://gitcode.com/gh_mirrors/ht/html2jade html2jade是一…...

ufbx实战案例:构建自己的3D模型查看器

ufbx实战案例&#xff1a;构建自己的3D模型查看器 【免费下载链接】ufbx Single source file FBX loader 项目地址: https://gitcode.com/gh_mirrors/uf/ufbx ufbx是一个轻量级的单文件FBX加载库&#xff0c;能够帮助开发者轻松读取和解析FBX格式的3D模型文件。本文将通…...

BeetleX ServerBuilder详解:3行代码搭建企业级通信服务

BeetleX ServerBuilder详解&#xff1a;3行代码搭建企业级通信服务 【免费下载链接】BeetleX high performance dotnet core socket tcp communication components, support TLS, HTTP, HTTPS, WebSocket, RPC, Redis protocols, custom protocols and 1M connections problem …...