1.特点
游戏服务器:
交互频繁
单次交互数据量小
实时要求超高,不能接受1s以上的延迟
玩家要能看到其他玩家的状态
有聊天,帮会,组团,互相伤害等及时消息
排行榜及时变化
有独立的客户端可以保存玩家数据
网站服务器:
交互不频繁
单次交互数据量大,经常有文件上传下载、图片上传下载,大段文章,很多图片列表
能接受1s以上的延迟
大部分数据要求请求时间点的状态即可,不需要时时推送
浏览器作为客户端,安卓和ios客户端也是在仿照浏览器的功能
2.TCP连接 vs HTTP连接 实现原理
(1)TCP连接
建立一个TCP连接需要经过“三次握手“
第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连 接之前,TCP 连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过“四次握手”
(2)HTTP连接
HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用。
HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。
1)在HTTP 1.0中,客户端的每次请求都要求建立一次单独的连接,在处理完本次请求后,就自动释放连接。
2)在HTTP 1.1中则可以在一次连接中处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束后再发送下一个请求。
由于HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是一种“短连接”,要保持客户端程序的在线状态,需要不断地向服务器发起连接请求。通常的 做法是即时不需要获得任何数据,客户端也保持每隔一段固定的时间向服务器发送一次“保持连接”的请求,服务器在收到该请求后对客户端进行回复,表明知道客 户端“在线”。若服务器长时间无法收到客户端的请求,则认为客户端“下线”,若客户端长时间无法收到服务器的回复,则认为网络已经断开。
摘自 HTTP与TCP的区别和联系 - CSDN博客,有更详细的讲解。
- 基于tcp和http 原理 Connection使用
(1)TCP CONNECTION
TCP链接在创建好后,保持Connection,直到客户端或者服务器主动断开。而一般通过心跳包来确认连接的有效性。如果特定时间内没有收到心跳包,则一方主动断开连接
在连接保持的时间内,客户端或者服务器都可以使用Connection实例为对方发送信息,进行持续的交互。
交互的信息一般通过协议传输,用协议号来标识协议的唯一性。
客户端和服务器要提前用协议号与监听事件绑定好。当客户端或者服务器收到特定的协议后,触发响应的事件,进入到对应的类的接口中。
不管是客户端发送服务器的协议还是服务器发给客户端的协议,都可以不返回,单方面处理完即可结束。如果要返回还要通过对应的Connection实例,来主动推送消息给对方。
对于服务器,要管理已经创建好的所有TCP链接,一般通过玩家的唯一id与Connection一对一即可找到彼此。每个服务器只对应唯一连接,当然也可能一个客户端同时连接多个功能服务器。
(2)HTTP CONNECTION
由于HTTP的“短连接”特点,每次传输信息,都要创建新的连接。
每次请求又要携带大量的信息,而每次请求还要携带回所需要的信息。因此在客户端发送给服务器请求后,会同步等待服务器返回,服务器处理完成后,返回给客户端,客户端才接着处理下面的事情(当然也存在异步的HTTP请求)。
由于HTTP链接不能保持,所以服务器不用维护HTTP客户端链接,也就能找到客户端,不能为客户端推送数据,像聊天室这种强交互的业务,如果由HTTP来实现就本末倒置了。
3.游戏服务器业务需要
对于游戏服务器,各种各样的玩法(武器属性,战斗属性,升星,强化,帮会...),数据修改频繁,而每一次数据的修改都要与服务器进行交互,这每一次数据交互所传输的数据量一般比较小。玩家自己的一件武器升级,一个宝宝升星,一个宝石镶嵌...只要把对应的道具和要做的操作告诉服务器即可,当操作完成,服务器再把修改好的数据同步到客户端。
游戏客户端一般分为pc端,pc微端,Android端,ios端,网页端。网页端又分为js网页端、unity网页端、flash网页端... 现在市面上流行的稍大型或者稍复杂的游戏客户端js和flash已经很少了,至少也要是一个游戏客户端会存储大量的(一个玩家全部的个人数据)玩家数据。在玩家只是单纯的切换页面查看自己的道具或其他游戏元素时,客户端和服务器是不会进行交互的,只需要把客户端本地的数据展示出来即可。、
当玩家之间进行交互时,比如一个玩家对另一个玩家造成伤害,一个玩家抢了另一个玩家的物品,这时要让被伤害或者被抢的玩家知道。这就需要服务器通知这个玩家,你被玩家揍了,要报仇啊;你被玩家抢了,要记得抢回来...如果该玩家被打或者被抢的玩家没有在线,还要做离线处理,或者在设计功能时,特意的避开离线玩家。
4.网站服务器业务需要
对于网站平台服务器,一般用来展示一个文章列表, 一篇文章,一个图片列表,一张高清图片,一个视频列表,一个视频。一个用户进入到某个页面会看到大段的文章或者大量图片,会留在该页面一定的时长,这种交互节奏相对游戏业务就少了很多。
对于浏览器来说,是对缓存和本地存储都有很多限制,因此在浏览器本地是不会存储很多数据的。由于客户端的延迟,用户的请求节奏慢,服务器又无法给客户端推送服务器最新的数据等客观因素,客户端的数据很可能已经与服务器的数据有了很大出入,每次页面的切换、刷新都要从服务器请求大量的数据,同步最新的服务器数据。
根据游戏服务器和网站平台服务器的业务需要,对选择TCP还是HTTP会有一定的偏向。但是在实际生产中,还要结合更具体的功能和产品设计来选择更好的技术。毕竟还是有些游戏服务器用了HTTP协议实现,而有的平台也用了WebSocket。
需要服务器请联系我,联系方式TG:@PDD2025 微信QQ同号 1048884847