基于游戏聊天系统移植的聊天社交app

 2022-09-04 08:09

论文总字数:40065字

摘 要

随着移动互联网发展越来越迅速尤其是随着网络条件的便利,人与人之间的沟通需求变的细腻、丰富。通讯需求中有大量的即时沟通需求,而这个断点沟通、一对多沟通、多对多沟通便会衍生出更具体的产品需求。

本论文主要研究目的是在借鉴公司已有的游戏聊天系统服务器的背景下,提出一套新的移动网及时消息通信的解决方案。服务端通过java实现了具体的模块功能,客户端用objective-c语言实现ios端的前台功能。论文首先研究了及时通讯的发展历程,以及现状,并对于目前已知的难点问题进行了分析研究。然后阐述了底层的协议选择问题,对TCP及UDP协议进行了详细的研究分析,在底层基于TCP/IP的协议传输,应用层使用websocket协议约定端对端的会话方式,并使用JSON格式来封装消息。服务端接口设计采用restful api的设计模式,规范接口设计流程。最终实现ios客户端和架构在公司服务器上的服务端网络通讯。

关键词:即时通讯、传输协议、websocket

Instant messaging system based on the corporate servers

71Y13119 Haoran Zhao

Advisor Hui Tang

Abstract

With the rapid development of mobile Internet, especially with the convenience of network conditions, the communication needs between people become delicate and rich. There is a large demand for instant messaging in communication requirements.

And this breakpoint communication, one to many communication, many to many, communication will be derived more specific product needs.

The main purpose of this dissertation is to propose a new solution for mobile Internet instant messaging based on the existing game chat system server in the campany. The server implements the specific module function through Java. Client using Objective-C language to achieve the IOS side of the front function. Firstly, this paper studies the development process and current situation of instant messaging, and analyzes the difficult problems that have been known. Then, the protocol selection problem of the underlying layer is discussed, and the TCP and UDP protocols are analyzed and analyzed in detail. In the bottom layer, TCP/IP based protocol transport, the application layer uses the websocket protocol, the end to end session, and uses the JSON format to encapsulate the message. The server interface design adopts the design pattern of restful API to standardize the interface design process. Finally, IOS server and client server network communication can be achieved on the company server.

Keywords:Instant Messaging System、transport protocol、websocket

目 录

第1章 绪论 1

1.1 引言 1

1.2 移动IM系统发展现状 1

1.3 移动IM系统设计及实现难点 1

第2章 应用到的技术及原理 3

2.1 网络编程基础理论 3

2.1.1 tcp协议与udp协议 3

2.1.2 Socket套接字 4

2.2 协议选择 2

2.2.1 传输层协议 2

2.2.2 应用层协议 4

2.3 数据传输格式 7

2.3.1 数据大小 7

2.3.2 数据安全 7

2.3.3 编码复杂度 7

2.3.4 通用性 8

2.3.5 protobuf数据格式 8

2.4 连接保持机制 9

2.4.1 安卓的心跳保活机制 10

2.4.2 ios端APNs服务器推送机制 10

2.5 服务端接口设计模式 11

2.5.1 restful api设计 11

第3章 系统设计与实现 13

3.1 服务端接口设计及实现函数 13

3.1.1 服务端架构设计 13

3.1.2 本地服务器设计 13

3.1.3 服务端接口说明 14

3.1.4 几种数据包结构 14

3.1.5 IM用户管理 15

3.1.6 好友与黑名单 17

3.1.7 在线与离线 19

3.1.8 发送消息 21

3.1.9 文件上传 23

3.2 ios客户端的设计与实现 25

3.2.1 封装类说明 25

3.2.2 消息功能概述 25

3.2.3 发送消息 26

3.2.4 接收消息 27

3.2.5 消息转发 27

3.2.6 消息撤回 27

3.2.7 音频录制及播放 28

3.2.8 组群功能 29

3.2.9 APNs推送 30

3.2.10 前台图形界面实现 31

第4章 总结和展望 34

4.1 总结 34

4.2 展望 34

绪论

引言

互联网在最近10年的时间内飞速发展,IM(Instant Messaging 及时通讯系统)也快速的从pc端向手机终端转移并渗透。各大聊天社交产品如微信、qq、易信等长时间霸占应用市场,成为用户最受欢迎的产品,几乎每个手机、每个人每天都会使用移动IM产品。所以IM产品的功能变得原来越丰富,用户体验、用户反馈也日益提升。IM产品的用户粘性十分强,导致各大公司、厂商都极力想把自己的领地深入到该领域中。腾讯、阿里、百度、网易等互联网巨头已经把大部分市场瓜分,而中国移动、中国联通、中国电信等三大运营商也陆续推出过自己的IM及社交产品。目前的移动互联网市场处于迅猛发展的时期,互联网的创业门槛低,资本市场充足,🙆越来越多的企业和创业者加入进来,竞争激烈刺激。

移动IM系统发展现状

目前移动IM产品百花争鸣,产品的内容变得越来越复杂,聊天、社交、直播、个人状态等功能都被尝试加入进IM产品。但是国外市场还有另外一种发展趋势—极简。产品只做好其中一个模块,比如专攻聊天,专攻朋友圈等。两种发展趋势在全球都有很好的例子,如微信、Line、WhatsApp等。对于企业级的产品来说,产品的定位十分重要。IM在全球范围的用户规模已经相当非常可观。根据RadicatiGroup的统计和预测,2016年全球已有23亿

移动IM系统设计及实现难点

一套完整的IM系统实施需要考虑多方面的因素。在不同的领域、不同的应用场景,其技术实现细节又不尽相同。一套由公司内部游戏聊天系统移植出的IM通讯系统又需要考虑哪方面的设计问题,选择怎样的技术方案,这些都是项目组需要进行的第一步工作。

(1)通讯方式如何选择:众所周知,IM通讯方式基本上就分为两种。P2P(设备直连)以及通过服务器中转。P2P是两个通讯端直接建立通讯通道,优点是通讯稳定、保密效果好。一般在P2P产品启动后系统做两件事,发送UDP广播:发送自己的地址信息以及想接收的其他端的信息。同时开启TCP监听来等候其他端的链接。但是这种方式的极大弊端是子网(局域网)外部很难访问到子网内的计算机(因为NET的存在),所以导致很多应用场景难以选择P2P的方式。那么另一种方式服务器中转通讯方式就被广大的IM厂商及公司所采用了。两个客户端之间的消息经由服务端中转后进行传输,这种方式满足如离线消息、聊天群组等业务场景。但是弊端是服务器的设计复杂,并且对于并发的要求比较高。

(2)网络连接及协议的选择:网络连接的方式一直是设计IM系统所备受讨论的内容。使用基于TCP的长连接还是基于HTTP的短连接在不同的应用场景中有着不同的技术侧重。不过基于对于流量的消耗以及对于传输时效性的追求,我们采取最简短的传输方式—websocket的网络连接协议。在后文会对websocket技术进行详细介绍。

(3)数据信息格式如何选择:常见的有xmpp、protobuf、私有二进制、MQTT、定制化XML等。在IM系统的开发中选择数据信息格式应该主要考虑的主要因素有:压缩后的数据包的大小、数据序列化的时间效率。常见的技术选择一般会使用protocol buffer或定制化的protobuf。

(4)心跳保活包的设计:即时通讯系统的最重要的特点是“及时性”当APP进入后台挂机时或者长期,必须有一个机制使APP保持网络连接,否则应用将无法保持网络连接导致会话失效,用户无法收到信息等严重情况。我们知道TCP协议有KEEPALIVE这个机制,客户端会隔一段时间向服务器发送心跳包。但是实际情况更多的是需要我们在应用层设置心跳保活机制。这点也会在后文详细阐述原因。

(5)ios端的后台消息推送:ios平台的特殊性导致其不像安卓平台一样有真实的“后台”,当ios应用退出到桌面时,应用本身无法用代码来实现网络保活,那么学习和了解ios的推送服务器APNs就又是一个前端开发的难点。

(6)消息重发机制:现实中的网络情况往往比较复杂,网络状态不好的情况下,消息可能会发送失败,一个合理高效的消息重发机制是系统必须实现的。如何维护消息重发队列,间隔多少秒重发消息,重发多少次,时间间隔和重发次数对于服务端的效率有何种影响,这些都是设计时需要考虑的重要问题。

(7)文件上传机制:文件上传、语音传输。这部分又是比较重要讨论的问题。音频传输的格式在ios和安卓下面都不相同,两个平台的格式都不互通,那么当ios与安卓用户进行语音聊天的时候,怎样解决音频文件可以在两端传输的问题就成了一个难题。解决这个问题目前基本有两种成熟的方案:1.双平台都将音频文件发送到服务器上,再由服务器进行转发,但是这种方法对于服务器的负担会比较大。2.使用相同的第三方库对音频进行编码处理,再进行P2P的传输。

在第二章的应用技术及原理中会详细阐述本项目所选用的原理及技术。

应用到的技术及原理

网络编程基础理论

tcp协议与udp协议

(1)简介

首先回顾一下基础课程的知识。根据OSI(开放系统互联参考模型)模型的7层划分。TCP与UDP协议都属于传输层的协议。传输层主要负责数据在两个客户端(进程)之间的传递,是第一个端对端的层次。在这层中可以确保数据没有差错、顺序正确的到达目的地。它还可以进行差错控制和流量控制。所以,报文以怎样的约定方式发送到网络层,并且以怎样的方式建立两端之间的连接,这些都要依靠传输层协议。TCP和UDP应运而生。[1]

(2)TCP:传输控制协议

TCP(传输控制协议):TCP提供的是面向连接的、可靠的服务。这意味着,如果两端使用TCP协议进行通讯,那么在通讯之前必须要建立一个TCP连接通道。并且TCP的连接只有一对一,无法进行广播和多播。TCP的可靠性是指,在报文发送时,会被拆分成一个个符合TCP规定的数据段,并且在每段发送后都会确认该段是否被正确接收,否则将会把当前段重发,因此TCP连接很少会出现报文丢失或缺失的情况。由此可见,TCP 的可靠性意味着要付出更大的时间成本以及承受更多服务端的负载压力。举个通俗点的例子来说,TCP的两端就好比两个人在打电话,两人之间的电话线路连接就是TCP连接,A对B说完话后,B听到A的话语再进行回话,整个过程稳定,安全。

要深入了解为什么TCP协议是面向连接和可靠的,那么就必须要了解TCP三次握手过程。在客户端和服务端准备通讯的开始,TCP必须通过三次握手来建立一个稳定的连接,之后数据会在这个连接中传输。

第一次握手:客户端发送syn包(syn=p)到服务器,客户端状态变为等待服务器确认(SYN_SEND)

第二次握手:服务端收到syn包,确认接收(ack=p 1),自己再追加一个syn包(syn=q),把这两个包合并(syn ack包)发回给刚刚的客户端,服务器状态变为已接收状态(SYN_RECV)

第三次握手:客户端收到服务器的syn ack包之后,再次给服务器发一个确认包ACK(ack=q 1),发送完这个包之后,客户端和服务器就变成ESTABLISHED状态,三次握手完成。

(3)UDP:用户数据报协议

UDP(用户数据报协议):UDP是简单的面向数据报文的协议。它提供不可靠的服务。使用UDP协议意味着在通讯的两端不需要提前建立一个连接。当A端需要向B端发送消息的时候,A端产生UDP报文,UDP报文有目标端口的信息和IP地址,下发到网络层进行报文传输。通俗点说,UDP传送类似于广播,A向网络中呼喊“我要给B发送消息”,消息在各个中转站之间中转。A不知道它的消息是否准确无误的传达给B,因为没有一个稳定的连接在A、B之间。所以UDP传输的成本以及资源占用相对于TCP来说减少了非常多。[2]

(4)总结与对比

TCP:1.需要建立连接

2.数据传输大小不受限制

3.必须通过三次握手来完成连接

UDP: 1.无需建立连接,发送UDP报文(包含目的IP信息、数据、来源)

2.数据最大约64K

3.可能会丢失数据或顺序错误,服务不可靠

4.效率高,服务器并发负载低[3]

Socket套接字

(1)Socket本质

Socket是网络编程中最重要的基础,理解socket的本质并且熟练学习并掌握socket套接字的用法是构建IM系统底层的核心及基础。

Socket本质上不是一个协议,它的本质是对传输层的一系列封装,是传输层和应用层之间的桥梁。[4]

图 1 socket传输图解

如图所示,在客户端和服务端之间建立的双向数据通道,通道的两端分别是客户端和服务端的socket。程序通过socket向服务器/网络发出请求或者应答请求。所以当我们在程序中编写代码的时候,使用socket套接字,其实就是在应用层中通过socket把传输层需要的内容告诉传输层。

(2)Socket连接过程

客户端请求:客户端的socket会提出连接的请求。需要其描述目标服务器socket的地址和端口号。

服务器监听:阻塞状态,时刻监听是否有客户端的连接请求。

连接确认:当服务端socket收到客户端socket的连接请求,服务端就建立新的线程,将客户端请求的该socket信息发送给客户端,客户端确认后两端建立连接(在新线程中),服务端总socket依旧处于监听状态。

总体的流程如下图所示。[5]

图 2 socket连接TCP实例图

剩余内容已隐藏,请支付后下载全文,论文总字数:40065字

您需要先支付 80元 才能查看全部内容!立即支付

该课题毕业论文、开题报告、外文翻译、程序设计、图纸设计等资料可联系客服协助查找;