精华内容
下载资源
问答
  • 三个月死磕Python是种什么样的体验?

    万次阅读 热门讨论 2018-04-04 00:00:00
    作为实验楼的网红课程——「 楼+ Python实战 」已经走过了第四期,经过了三个月的学习,大家感想如何?以下是学员们的真实反馈。学习收获服务反馈给老师和助教的评价emiyasyrou:真的非常感谢实验楼的大神搞了这么一...

    关注「实验楼」,每天分享一个项目教程   

    3个月的死磕Python后,参加「 楼+ Python实战 · 第4期 」的学员们感想如何?下面带来他们的真实评价。

    作为实验楼的网红课程——「 楼+ Python实战 」已经走过了第四期,经过了三个月的学习,大家感想如何?以下是学员们的真实反馈。

    学习收获

    服务反馈

    给老师和助教的评价

    emiyasyrou:


    真的非常感谢实验楼的大神搞了这么一个学习项目,实验的方案设计得非常清晰,一步步照着教程码下来基本上可以把各个知识点领会的七八成。有些特别难懂的概念,特别难表述的操作,也有老师的视频的示范,所以前5周的实验基本上没有遇到特别困难的地方。只是有几个挑战比较让人困惑,PASS的基准太过苛刻,建议把可能的采分点提示得更明确一些,让进行挑战时不至于迷失得太远。

    毕业寄语:

    人生苦短,我用PYTHON,虽然还剩大项目没有clear,但通过实验楼课程系统地学习,为自己的PYTHON技术打下了坚实的基础。这两天还活学活用,帮闺蜜(可爱型的)处理了她的2G的大数据,成功地邀请她吃了一次大餐,嘻嘻。

    (这位同学你真的很适合当程序员诶,帮妹子干活换来请她吃饭,一听就是程序员日常 :)也祝你在成为程序员之前早日收获爱情,因为当了程序员之后就不会再有女朋友了哈哈哈……)

    Michael999


    报名的初衷是自学效果太慢,想找一个前辈或者团队来指引,毕竟对工作人士来说 时间是最宝贵的。从结果来看,也基本上达到了预期。虽然我中间因为结婚和换工作等没有参加大作业和很多实验,但从整个的教程中学到了很多,在换工作时起了很大作用,成功的转行了。对运维人员来说,学习python从事运维自动化开发是一条捷径。感谢楼+。

    (也感谢每一位努力的同学,能成功转行就是努力的最好证明。)

    koplee


    实验楼内容系统很新很实用,非常感谢实验楼提供这样高质量的课程。实验楼的学习量比较大,如果按照12-16个小时的学习时间还是可以掌握的,因为每周周末都有种入门的感觉,学起来也爽,时间的投入最终实现了质变。实验楼挑战有激励作用,助教的帮助很突出,特别是一对一远程帮助,可以让你看到助教是怎么找问题的,帮你学习到一些很难学到的技巧和知识,很感谢助教安西教练和包里恩的帮助,特别是助教安西教练,从他那里学到的最多了,还有强大的导师团队,找问题一针见血。还是希望以后导师的直播还是多讲一些知识点的使用经验,特别是第一周的直播让我有种原来python还可以这么写的感觉。总之,实验楼这个课程还是很结合实际应用的好课程。

    毕业寄语:

    很遗憾没有始终如一的学完课程。后面慢慢补一补。加油吧。

    (同样感谢各位助教们~经常晚上十二点或者公司旅游的途中还在坚持答疑,比心)

    Fire_atom


    原本以为课程会比较轻松,实际学习发现课程量很大,对我来说,内容难度上设置比较合理,不能很容易看明白,但是不断反复的去看去理解收获蛮大,特别是回过头来重新看了一遍发现之前有一些点被想当然的默认接受了,从这些细节延伸寻找资料对理解程序很有帮助。还有些内容没来得及完成,要加油搞完,然后就是自己学学算法吧,这个课程很大程度上是教程序框架逻辑,两手都要抓都要硬。

    (楼+ 三个月的学习量确实很大,把教学内容完整地学一遍,一定会达到你预期的目标!)

    shasha223


    在这期间,虽然有的地方没有跟上,但是让我在学习上更主动了,以前学习一门语言时,总是喜欢看别人的讲解,自己动手的时间很少。在Python的学习中,各位老师安排的课程非常系统化,每天的日报、周报能督促我们去学习,也喜欢上了自己实现某个功能的感觉。非常感谢各位老师,使我对学习一种新语言充满了热情,以后会继续关注实验楼的课程,也希望实验楼能多上线一些计算机视觉、机器学习相关的课程。

    毕业寄语:

    在以后学习新的知识的时候,没有人总会给总结好应该做什么,学什么,自己应找到学习新东西的能力。

    (学习编程最重要的就是实践,希望同学坚持下去,实验不息,编程不止~)

    墨北之南


    因为要考研,不得不中止了当时下定决心走到最后的心。只跟到了五周,不过收获已经不小了。逼着自己每天花大量时间来学习,来写代码,逼着自己进步。如果有机会,等考研结束,我说不定还会再报名吧,毕竟没完成,是个遗憾。同时,也觉得实验楼的楼+课程能再详细一点,挑战和课程难度差距稍微有点大,这也是咬着牙最后也没走下来的原因吧。希望楼+越来越好,有机会会回来的。

    毕业寄语:

    别配不上自己的野心,又辜负了所有的努力。

    (感谢每一份坚持和努力,课程没学完可以继续学习,或者和班主任申请延期。还可以和班主任预约,免费参加下一期的大项目协作。)

    stenphen


    实验楼的模式还是非常好的,边做边实践确实是入门的最有效方式。

    如果要我提什么建议的话,我觉得有些章节跨度比较大,实验楼确实没必要每章讲得太细,但是如果章节末或者开始的时候给出点参考资料或者链接,让我们能够自己比较有方向的去查阅章节内没细说的细节会让学员不需要浪费太多的查询时间。哪怕是书籍也可以列出来,我们花了几千块报的班,不会几十,几百块的还要计较。

    此外,04期主要还是偏web编程,这个可能和实验楼师资搭配有关,下次希望有更多的内容,如果可能,可以对不同的方向设定不同的课程,给学员更多人性化选择。

    再次感谢实验楼领我入门,也祝实验楼越办越好!

    毕业寄语:

    希望自己能从Python出发切入研发的领域找到未来职业发展的新方向!



    「楼+ Python实战」第 7 期正在报名中,将于5月17日开课。

    第 7 期中,除了对原有课程进行了优化,导师团队也有所升级。曾任职于腾讯、盛大的天火老师也加入了教学团队,与Intel、IBM出身的实验楼CEO、CTO、高级工程师一起,组成空前强大的教学团队,给大家带来更多一线开发的经验。

    为了鼓励大家学习,我们还准备了以下福利:

    • 奖学金:当期楼+中,有效学习时间排前三名者,可获得500元奖学金。

    • 高级会员:开课即送3个月高级会员,可使用高级功能。

    • 毕业礼物:优秀学员还有毕业奖励,礼物为会员、训练营、实体礼品等奖励。

    现在报名楼+,还有限时优惠,您可以点击阅读原文,全方位的了解楼+课程。

    点击「阅读原文」

    了解楼+ 更多信息

    展开全文
  • 本文将会从一爱情的故事开始,着力从什么是三次握手、为什么是三次而不是俩次或者四次、TCP关闭的过程、为什么要四次挥手、而不是次、为什么最后是2MSL、什么是2MSL这些问题展开分析,详解,让你一文弄懂次...

    引言

    本文将会从一个爱情的故事开始,着力从什么是三次握手、为什么是三次而不是俩次或者四次、TCP关闭的过程、为什么要四次挥手、而不是三次、为什么最后是2MSL、什么是2MSL这些问题展开分析,详解,让你一文弄懂三次握手、四次挥手。

    『前方重点』☛面试时一般来说越简单的问题,一般隐藏的坑越大,一般面试官让你谈一下三次握手和四次挥手的理解时,其实想看的可能是你对整个HTTP协议、原理等一些的理解,希望大家阅读的时候可以带着我上面的问题去理解这篇文章。

    面试问题汇总:

    1. 请你手画出三次握手和四次挥手的原理图(示意图)?
    2. 可以用一个故事谈一下你对三次握手或四次挥手的理解吗?
    3. 谈一下什么是三次握手?
    4. 三次握手的目的是什么?
    5. 为什么http建立连接需要三次握手,不是两次或四次?
    6. ISN(Initial Sequence Number)是固定的吗?
    7. 三次握手过程中可以携带数据吗?
    8. 什么是四次挥手?
    9. 为什么要四次挥手?(四次挥手的目的)
    10. 什么是全双工信道?
    11. 4次挥手中,如果没有(稍等,还有最后一个包),那是不是就是三次挥手?
    12. 什么是 MSL、 为什么是2MSL
    13. SYN攻击是什么?

    『正文开始』☞谈谈我对TCP三次握手和四次挥手的理解

    开局一张图,内容全靠编,图来 ↘

    在这里插入图片描述

    小爱同学(故事来喽)ʚ ɞ:
    • Jack:我要挂了哦
    • Rose:等哈,我还要敷面膜
    • Rose:我敷完了,现在可以挂了
    • Jack:我舍不得挂,你挂吧
    • Rose:好吧,我挂了
    • Jack:等了2MSL听见嘟嘟嘟的声音后挂断

    一、三次握手讲解

    三次握手之所以是三次,是为了保证client和server均让对方知道自己的接收和发送能力没问题而保证的最小的次数。

    • 第一次client => server 只能server判断出client具备发送能力
      • 客户端发给服务器,发了一个字段叫syn后面会带一个标志位可能是1、2、3。
      • 比如我建立一个TCP连接,syn=1。如果我又建立了第二个TCP连接,syn=2,这个值是唯一得值,其代表我当前次TCP连接。
      • 服务器由这个syn值知道客户端要求联机。(客户端:我要连接你)
    • 第二次 server => client client就可以判断出server具备发送和接受能力。
      • 服务端收到联机请求后要求确认信息,向客户端发送了一个字段(ack+syn(这个是客户端发来的字段----联机信息))。
      • 此时客户端就知道服务器已经充分做好了准备,可以联机了。(服务端,我已就位,你来连吧)
    • 第三次:此时client还需让server知道自己接收能力没问题于是就有了第三次 第三次 client => server 双方均保证了自己的接收和发送能力没有问题
      • 只有一次的话,客户端准备好了告诉服务端我要发请求了,只是代表客户端准备好了,但是服务端一定准备好了吗?不一定,因为每个服务器都要最大请求处理次数,当其到达最大次数,就没有办法处理了,所以一定要服务期准备好。
      • 所以有了第二次,当服务器准备好了就要告诉客户端,ask+syn就是告诉客户端我已准备好,这样的话不就需要俩次吗?为什么要有三次呢?
      • 举个例子,加入服务器告诉了客户端我已准备好,客户端知道了,万一客户端想约会去了,给溜了怎么办,服务器还在那里苦苦的、痴情的等待着,这这样子肯定不行啊,这种会造成服务器的资源大大的浪费。
      • 所以服务器会等客户端再次确认是没有问题的,服务器才会真正的建立联系,如果客户端没有确认,那么服务器就认为客户端没有准备好,是不会和他建立联系的。
        其中,为了保证后续的握手是为了应答上一个握手,每次握手都会带一个标识 syn,后续的ACK都会对这个syn进行加一来进行确认。

    二、为什么http建立连接需要三次握手,不是两次或四次?

    • 三次是最少的安全次数,确保双方都准备充分,不会存在任何一方突然断开连接。
    • 两次不安全,四次浪费资源;

    三、ISN(Initial Sequence Number)是固定的吗?

    • 当一端为建立连接而发送它的SYN时,它为连接选择一个初始序号。ISN随时间而变化,因此每个连接都将具有不同的ISN。ISN可以看作是一个32比特的计数器,每4ms加1 。这样选择序号的目的在于防止在网络中被延迟的分组在以后又被传送,而导致某个连接的一方对它做错误的解释。
    • 三次握手的其中一个重要功能是客户端和服务端交换 ISN(Initial Sequence Number),以便让对方知道接下来接收数据的时候如何按序列号组装数据。如果 ISN 是固定的,攻击者很容易猜出后续的确认号,因此 ISN 是动态生成的。

    四、三次握手过程中可以携带数据吗?

    • 其实第三次握手的时候,是可以携带数据的。但是,第一次、第二次握手不可以携带数据
    • 为什么这样呢?大家可以想一个问题,假如第一次握手可以携带数据的话,如果有人要恶意攻击服务器,那他每次都在第一次握手中的 SYN 报文中放入大量的数据。因为攻击者根本就不理服务器的接收、发送能力是否正常,然后疯狂着重复发 SYN 报文的话,这会让服务器花费很多时间、内存空间来接收这些报文。
    • 也就是说,第一次握手不可以放数据,其中一个简单的原因就是会让服务器更加容易受到攻击了。而对于第三次的话,此时客户端已经处于 ESTABLISHED 状态。对于客户端来说,他已经建立起连接了,并且也已经知道服务器的接收、发送能力是正常的了,所以能携带数据也没啥毛病。

    五、什么是四次挥手?

    四次挥手
    • 第一次挥手:浏览器发送给服务器,告诉服务器请求报文发送完毕
    • 第二次挥手:服务器发送给浏览器,告诉浏览器请求报文接受完毕,可以等待断开
    • 第三次挥手:服务器发送给浏览器,告诉浏览器响应报文发送完毕
    • 第四次挥手:浏览器发送给服务器,告诉服务器响应报文接受完毕,可以断开连接
    • 最后服务器断开连接,浏览器断开连接
    四次挥手详细过程(TCP关闭连接过程)☛结合开局图解
    1. Client向Server发送FIN包,表示Client主动要关闭连接,然后进入FIN_WAIT_1状态,等待Server返回ACK包。此后Client不能再向Server发送数据,但能读取数据。
    2. Server收到FIN包后向Client发送ACK包,然后进入CLOSE_WAIT状态,此后Server不能再读取数据,但可以继续向Client发送数据。
    3. Client收到Server返回的ACK包后进入FIN_WAIT_2状态,等待Server发送FIN包。
    4. Server完成数据的发送后,将FIN包发送给Client,然后进入LAST_ACK状态,等待Client返回ACK包,此后Server既不能读取数据,也不能发送数据。
    5. Client收到FIN包后向Server发送ACK包,然后进入TIME_WAIT状态,接着等待足够长的时间(2MSL)以确保Server接收到ACK包,最后回到CLOSED状态,释放网络资源。
    6. Server收到Client返回的ACK包后便回到CLOSED状态,释放网络资源。

    六、为什么要四次挥手?

    ☞四次挥手的目的:为了断开连接
    • 发送请求断开需要俩次挥手:浏览器讲请求报文发送给服务器
    • 返回响应断开需要俩次挥手:服务器将响应报文发送给浏览器
    ☞什么是全双工信道?
    • TCP是全双工信道,就是客户端与服务端建立两条通道。
    • 通道1:客户端的输出连接服务端的输入;
    • 通道2:客户端的输入连接服务端的输出。
    • 两个通道可以同时工作:客户端向服务端发送信号的同时服务端也可以向客户端发送信号。所以关闭双通道的时候就是这样:
      客户端:我要关闭输入通道了。 服务端:好的,你关闭吧,我这边也关闭这个通道。
      服务端:我也要关闭输入通道了。 客户端:好的你关闭吧,我也把这个通道关闭。
    ☞问题: 4次挥手中,如果没有(稍等,还有最后一个包),那是不是就是三次挥手?

    由于TCP连接是全双工的,因此每个方向都必须单独进行关闭,所以即使没有最后一个包,也需要先回复断开连接的请求,然后再发送关闭请求

    七、什么是 MSL、 为什么是2MSL

    • Maximum Segment Lifetime,译为“报文最大生存时间”。RFC 793中规定MSL为2分钟,实际应用中常用的是30秒,1分钟和2分钟等

    • 2MSL即两倍的MSL,TCP的TIME_WAIT状态也称为2MSL等待状态

    • 当TCP的一端发起主动关闭,在发出最后一个ACK包后,即第3次握手完成后发送了第四次握手的ACK包后就进入了TIME_WAIT状态,必须在此状态上停留两倍的MSL时间。

    • 等待2MSL时间主要目的是怕最后一个ACK包对方没收到,那么对方在超时后将重发第三次握手的FIN包,主动关闭端接到重发的FIN包后可以再发一个ACK应答包。

    • TIME_WAIT状态时两端的端口不能使用,要等到2MSL时间结束才可继续使用。 当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。不过在实际应用中可以通过设置SO_REUSEADDR选项达到不必等待2MSL时间结束再使用此端口。

    八、SYN攻击是什么?

    • 服务器端的资源分配是在二次握手时分配的,而客户端的资源是在完成三次握手时分配的,所以服务器容易受到SYN洪泛攻击。SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server则回复确认包,并等待Client确认,由于源地址不存在,因此Server需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络拥塞甚至系统瘫痪。SYN 攻击是一种典型的 DoS/DDoS 攻击。
    • 检测 SYN 攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击。在 Linux/Unix 上可以使用系统自带的 netstats 命令来检测 SYN 攻击。
      netstat -n -p TCP | grep SYN_RECV
    • 常见的防御 SYN 攻击的方法有如下几种:
      • 缩短超时(SYN Timeout)时间
      • 增加最大半连接数
      • 过滤网关防护
      • SYN cookies技术

    九、总结

    • 总体来说,TCP三次握手、四次挥手算是明白了,但是如果深究背后的原理,还是会牵扯出来很多的知识点,比如几层http协议、请求报文、响应报文、HTTP缓存机制与原理等,后续再逐一详解吧。
    • 愿你在这个代码繁杂、头发渐秃的编码世界里,可以温暖自己,坚持学习。

    使人疲惫的不是远方的高山,而是鞋子里的一粒沙子。——伏尔泰

    『传送门』☛HTTP缓存机制与原理详解

    展开全文
  • 游戏服务器开发都要学什么

    万次阅读 多人点赞 2019-08-22 17:26:27
    近来遇到有很多人想从其它开发领域转到游戏服务器开发行业上来,他们或许觉得游戏服务器开发工资高,或许觉得做游戏服务器需要掌握的技术更高级,可以锻炼自己,或许觉得想换环境等等。不管出于什么原因吧,做为一...

    一,游戏服务器开发工作介绍

    近来遇到有很多人想从其它开发领域转到游戏服务器开发行业上来,他们或许觉得游戏服务器开发工资高,或许觉得做游戏服务器需要掌握的技术更高级,可以锻炼自己,或许觉得想换个环境等等。不管出于什么原因吧,做为一名几年的游戏服务器开发者,当然是持欢迎态度的,那么我就先介绍一下游戏服务器开发的工作吧,游戏服务器开发具体要做哪些工作呢?

    1,团队沟通

    基本上不管做什么开发,都是一个团队来完成的,游戏也是如此,游戏团队一般由老板,总经理,CTO(技术主管),主策划(领导一些人,包括数值策划,系统策划,特效策划),主美(领导一些人,包括原画,UI设计,特效动作设计),客户端主程(领导一些人,客户端程序员,客户端程序员...),服务器主程(领导一些人,包括服务器程序员,服务器程序员),外加运维。而游戏的大部分逻辑实现与逻辑数据验证都会放在服务器端,所以服务端程序需要明确了解策划的需求,要了解就需要沟通,沟通方式的正确与否,直接关系到功能的实现是否正确,由于游戏逻辑的复杂性,单纯的文档描述可能不会非常完整,不像其它行业需求文档就几百页,详细的图文并茂,制定好之后也很少变化。所以做为一名游戏程序员,一定要有良好的沟通方式和技巧。

    2,架构设计

    这个架构设计就像盖房子打基础,基础好,房子就稳固,基础不好,房子高了就容易倒。架构设计需要结合软件工程学来搞,它需要对服务器的整个流程有足够的了解,对需求的变化有足够的认识。架构的设计一般有几个特性。

    首先是易用性,架构一旦完成,在开发的时候就要方便使用,比如网络通信架构,设计好之后,其他开发者就不需要关心客户端的数据是怎么被传输到服务器端的,这个时候对于服务器开发者来说,只需要实现一些简单的接口,就可以直接对客户端发送来的请求进行处理操作。再比如说服务器端数据的存储与更新,开发者只需要写少量SQL语句或基本不用写,都由架构的底层代码完成,开发者只需要调用封装好的API,就可以把数据存入数据库而不用关心数据的最终流向,只需要关心实现逻辑就可以了。

    第二,可扩展性,可扩展性包括两个方面,一是代码的可扩展性,比如说游戏中的任务处理吧,一个游戏中任务可能有几十种,而且还可能不定时的增加,为了判断不同的任务类型该执行什么操作,最简单也是最差的写法是if else,想象一下,一个方法里面,有几十个if else,这简单是bug的理想诞生地呀。一种可行的做法是使用责任链模式(具体的请参考设计模式的实现),这样每种任务都有一个单独的类去处理它,而不会影响其它的类,符合开闭原则,相互关联少,越少越不容易出bug。二是部署的可扩展性,比如,如果在线人数突然增加或预期可能要增加,一台物理机器可能处理不过来这么多的请求,那怎么办?那就需要支持在不影响其它服务器运行的情况下,可以动态的添加机器。而当压力降低之后,又可以移除某些机器,合理利用资源。

    第三,高吞吐量,这个是指能尽量最大化的利用计算机固定的资源,去处理更多的请求,更快速的响应客户端。这就需要在服务器架构设计的时候考虑异步处理,减少IO等待时间(比如请求redis,存储数据库,和其它服务器通信)以及数据缓存。说到异步,一定会涉及到多线程,并发等相关的技术,所以架构设计的时候需要对这部分知识有足够的了解。

    第四,要考虑是否所有的功能模块都放在同一个进程中。也就是需不需要分布式开发,哪些功能需要单独拿出来。对于手机游戏来说,一般要求同时在线量比较小,功能比较单一,所有功能都在一个进程中,人数大量同时在线时,可以多部署几组进程。而对于大型网页游戏或客户端游戏来说,特别是有些大区或不分区的情况,单个功能访问量大,服务器就要考虑分布式部署开发了。

    架构设计一般需要有经验的开发者(项目主程)去搭建,新手可以做为了解,在接触到项目之后,可以按这个思路去理解项目的架构是怎么样构成的,如果让自己来做,能否模仿出来,有时间可以自己尝试去独立设计架构,锻炼自己的能力,为将来自己带项目做主程做好充值准备,机会都是留给有准备之人的。

     

    3,逻辑开发

    架构搭建完成之后,紧接着就是游戏服务器的逻辑开发,这时才开始真正去实现游戏需要的内容,比如注册,登陆,任务,活动,背包,组队战斗等。由于游戏逻辑可能需要的判断条件多,组合变化多,所以在游戏逻辑开发过程中,你会慢慢发现面向对象的重要性。逻辑开发是一个任重而道远的过程,同一个问题,可能有很多种实现方式,不同的实现方式对效率和吞吐量有很大的影响,所以就需要对需求功能的理解要深入,不同功能之间的关联要明确。对常用的设计模式要知道如何使用。比如像上面说的替换数量比较多的if else的方式。逻辑开发需要谨慎细心,而且一定要自己测试才可以,不然bug在不知不觉中就产生了。

    4,系统周边开发

    一个游戏成功的运营,需要很多服务去支持它,比如sdk接入,充值接入,日志统计,游戏运行管理系统(一般叫后台管理系统,是内部人员为了管理游戏的而开发的系统)。比如修改某个用户的等级,封号等。管理系统一般会用web开发,与游戏服务器通信。

     

     

    二,游戏类型与技术选择

    游戏服务器开发使用的技术取决于游戏的类型,不同的游戏类型,需要的游戏环境不一样,所使用的技术也不一样。但是在本质上都是一样的,都是面对数据,处理数据,不同的是面对的数量大小而已。

    1,PC类端游

    这类游戏在线人数庞大,游戏中要处理的数据也非常庞大。所以对服务器性能要求非常高,一般都是采用C++做为开发语言,C++可以直接操作内存数据,与操作系统直接交互,减少数据之间的复制,它运行效率高,处理速度快,是这类游戏开发的首选开发语言。服务器端采用分布式架构,把不同的模块分散在多台物理机上处理。需要学习的大致有C++编程,Linux网络编程、TCP/IP通讯协议、多线程编程再加数据库。它一般开发周期比较长,一个游戏的上线基本上需要三到五年。

    2,网页游戏

    这类游戏相对于端游来说,开发周期短,因为是网页游戏,游戏的界面展示依赖于网络传输,所在在画面和特效上会次于客户端游戏很多。游戏的特点主要集中在游戏的玩法上。但是对于服务器端来说,和端游类是差不多是一样的,有些公司之前是做端游的,他们就直接把端游的服务器架构拿来就可以使用,以完成快速开发。

    3,手机游戏

    手机类游戏目前是最火最热门的游戏,因为他的用户量大,用户占有时间长。但是手机游戏大多数是一般小游戏,功能简单,玩法单一,一般都是休闲娱乐的。现在也有一些稍微大型的MORPG游戏。所以手机游戏开发周期更短,上线更快。

    目前,游戏市场竞争激烈,当前服务器主流的开发语言是C++和Java,但是C++学习难度大,开发速度慢。为了满足游戏服务器快速开发,快速上线,所以一般来说我们都是使用Java语言来开发服务器。近年来,随着游戏市场的发展,游戏服务器开发技术因Java而生成了一套体系。可以供开发者选择。

     

    三,使用Java开发服务器需要学习什么

    Java语言,由于学习成本低,开发速度快,稳定性高,开源框架多,目前已成为网页游戏和手机游戏服务器开发的主要语言。咱们从系统的开发流程简单梳理一下服务器开发需要用到的技术。

    1,网络通信

    这个是首要实现的,如果没有网络通信,就没有服务器存在的必要了。网络通信就需要建立网络连接。目前网络通信有两种方式,一种是短连接,比如http,一种是长连接,比如socket,当然http也是基于socket的,socket是通信的基础。所以要对tcp/ip通信的知识有所了解,明白通信的原理。基于这两种网络通信,游戏服务器也分为两种,弱联网和强联网。弱联网的游戏一般是指一些小型的游戏,比如开心消消乐,连连看,以及一些卡牌养成类游戏,这类游戏一般几秒钟或几分钟再会与服务器同步一次数据,一般会使用短连接。而像一些arpg游戏,实时战斗类游戏,以及带同屏显示玩家的游戏,这类游戏与服务器交互信息频繁,一秒钟可能几十次,会采用长连接,避免每次连接重新建立消耗系统资源,提高通信效率。

    为了网络通信的效率,服务器要使用NIO(非阻塞网络通信)通信。它能支持大并发连接。Java NIO是多路复用IO,在多路复用IO模型中,会有一个线程不断去轮询多个socket的状态,只有当socket真正有读写事件时,才真正调用实际的IO读写操作。因为在多路复用IO模型中,只需要使用一个线程就可以管理多个socket,系统不需要建立新的进程或者线程,也不必维护这些线程和进程,并且只有在真正有socket读写事件进行时,才会使用IO资源,所以它大大减少了资源占用。目前基于此技术有很多开源框架,目前最热门的NIO异步网络通信框架是Netty,它目前已被应用到种大型的开源软件之后,比如RPC调用,阿里云的消 息队列组件RocketMQ,Spring cloud的网关组件也是用Netty实现的。为了便于新手学习,可以参考这个单服游戏服务器框:https://gitee.com/wgslucky/xinyue-alone-game-server  ,此开源框架实现了游戏服务器开发中常见的基本功能,比如网络通信,消息序列化与反序列化,逻辑处理,多线程封装,消息广播,消息加密解密,消息压缩与解压,连接管理,断包与粘包处理等。

    所以在网络通信这一块,如果是弱联网游戏,可以使用web那一套来开发游戏服务器,需要学习的技术一般有http原理,Json格式协议,servlet,Tomcat(也可以是其它web容器),spring等。如果是强联网游戏,要学习的技术有Netty或Mina可以选择一种,多线程以及线程池的应用。这是网络通信所必须掌握的。只要能把客户端发送的信息接收到,并解析成代码使用的明文,就是成功了一半了,剩下的事就是把代码封装好,方便逻辑开发调用!

    通信这块还要考虑消息的并发,长连接情况下,怎么处理断包,粘包问题,每个用户的消息处理的是不是有序的,如果有序会不会阻塞消息,如果无序会不会造成处理混乱,比如后到的消息先处理了,这些问题都要处理好,目前一般是保证同一个用户的消息要有序处理!

    2,数据存储

    网络通信调试好之后,不要急着做逻辑开发,还需要把数据如何存储理清楚!因为服务器端操作的全是数据,如果处理的不好,容易出bug,丢数据,这对游戏玩家来说是致命的,不可接受的!数据存储要考虑,

    一,数据如何存到数据库,是同步存储,还是异步存储!同步存储即将数操作完之后立刻写入数据库,异步操作即数据操作完之后先存储到内存缓存,然后由另外的线程或进程再同步到数据库!游戏中一般都是采用的异步存储方式,因为游戏并发量大,必须低延时,快速响应客户端!如果直接操作数据库太慢,会造成消息阻塞!内存缓存可先择的框架有redis,memcache,具体怎么同步到数据库,需要自己去设计了!

    二,数据接口如何设计,能不能用工作生成这些数据操作的代码,能不能不用写SQL语句,需是封装在底层,或由工具生成。编程是门艺术,在这就体现出来了,当然是仁者见仁,智者见智了!

    三,大并发情况下数据的一致性,像这类可能多线程操作的数据,一般是放在内存中,由锁来控制并发!所以对锁的使用要熟悉,不要出现死锁,或锁粒度过大,造成线程的长时间等待的情况!四,当数据量太大,一个数据库存储不了,数据该怎么分库分表!一种是水平划分,一种是垂直划分!具体的划分方式其它资料已有详细介绍,请自行查找阅读!目前有一个开源的分库框架mycat,是用JAVA写的,大家可以研究一下!

    四,目前常用的数据库有MySQL和MongoDB,MongoDB的优点是在开发过程中添加或删除字段不用操作数据库表,它是文档性数据库。两者各有利弊,可以都熟悉一下。

    3,逻辑开发

    逻辑开发就是实现游戏策划想象的各种游戏功能,比如,登录,物品使用,战斗结算等!逻辑开发代码量巨大,相互之间有很紧密的耦合性,所以每个功能模块一定要划分好!最好是接触下单元测试,写之前考虑一下是否方便单元测试,这样设计的代码会更加清晰,每个方法责任明确,不容易出bug!正是因为逻辑代码复杂,为了更好的管理代码,前辈们给我们总结了一些经验,就是著名的设计模式,所以学习一下设计模式对代码的管理有很大的好处!

    逻辑开发一般遇到的问题有:

    3.1,数据同步

    一说到数据同步或资源共享的时候,一般都会考虑到锁的使用。因为一份资源同时只能被一个线程访问才是安全的。Java的JDK中提供了一些锁,比如:synchronized,以及java.util.concurrent.lock包中的Lock对象,java.util.concurrent包中还提供了其它的一些原子操作的类,我们知道i++操作不是线程安全的,但是可以使用AtomicInteger中的getAndIncrement();方法代替,还有线程安全的ConcurrentHashMap哈稀Map。以及阻塞队列LinkedBlockingQueue等。都是逻辑开发中常用的处理数据同步的类。

    3.2,设计模式的使用

    使用设计模式,可以让代码更加清晰,可扩展性更强,维护性更佳,比如,任务系统,任务会有很多种类型,要获得任务数据时,在一开始写这个系统的时候,我是这样写的if(type == 1)做什么,else if(type == 2)做什么,else if(type == 3)......else if(type == 35) else等。如果需要添加新的类型,又要添加else,这些if else都在同一个方法中。最后都不敢动一块,就怕出bug。其实当一个方法中出现三个以上的if else将来还可能增加时,就应当考虑设计是不是有问题了,后来改成责任链模式或状态模式,就解决了这个问题。还有一个例子是,当一个值变化,要影响多个任务完成状态时,可以使用观察者模式或监听模式或订阅模式去实现,这样功能之间完全解耦,出问题的机率会很小很小。

    3.3,数据缓存框架的API使用

    目前主流使用的数据缓存框架有redis和memcache,虽然在逻辑开发前,主程会对这些进行一些封装,但是作为使用者还是需要对这些框架的客户端的使用要有所了解的。这些可以去阅读相关的文档。不是太难。

    4,程序部署与运行

    目前,大多数Java项目都采用maven管理 ,可以使用maven打包开发好的程序,程序一般运行在远程服务器上,比如云服务器。一般运行Java程序的远程服务器都是Linux系统,需要使用Linux命令操作,或写一些shell脚本去自动化部署管理一些程序。

    5,艰苦奋斗的精神

    首先,一定要让自己对这一行有兴趣,明确自己在这一行的技术选择,人生选择。很多人都知道,程序员加班是常有的事,坚持的住就做,坚持不了就再换一家公司做。

    综上所述,想做Java游戏服务器方面的开发要掌握的技术有以下一些:

    1,网络通信框架,Mina或Netty必须熟悉一种。而且自己必须要亲自搭建过,并明白其它原理。

    2,通信协议制定和处理断包粘包,这一般属于网络通信框架要解决的问题。

    3,数据缓存框架,redis或memcache选择一个,能熟练使用其客户端的命令。

    4,Java基础,Java NIO通信原理,Java集合的使用,Java多线程开发,Java锁的使用,在Java界,以后Spring MVC,Spring Boot,Spring Cloud是必不可少的。

    5,了解一些设计模式。最好能把23种设计模式都看一遍,并结合自己的开发经验,看哪些可以用到设计模式,但也不能死套设计模式,要灵活运用。

    6,熟悉使用Mysql数据库

    7,了解数据库连接池的一些框架,比如Mybatis,hibernate

    8,对Http协议熟悉,熟悉一种web容器,比如tomcat,了解其配置。

    9,对常用的一些Linux命令要熟悉使用。

    10,热爱学习,不断的充实自己,上面所说的只是入门技能而已,真正做起来要复杂的多,一定要让自己喜欢游戏这个行业,这样才能有动力做下去,做自己喜欢的工作还是比为了工作要好的!


     

     

                                                                        

     

    展开全文
  • 眼看2012年就要结束了,刚好借这机会将2012年度IT博客大十强获奖感言发表出来,也算是对2012年博客的一总结,关键字是“梦想”、“学习”、“坚持”、“自信”、“淡定”。希望大家一如既往地支持老罗的CSDN专栏...

            前段时间参加了2012年度IT博客大赛,进了前十强,写了一篇获奖感言,不过还没正式在CSDN发表出来。眼看2012年就要结束了,刚好借这个机会将2012年度IT博客大十强获奖感言发表出来,也算是对2012年博客的一个总结,关键字是“梦想”、“学习”、“坚持”、“自信”、“淡定”。希望大家一如既往地支持老罗的CSDN专栏《老罗的Android之旅》以及老罗的新书《Android系统源代码情景分析》。

    《Android系统源代码情景分析》一书正在进击的程序员网(http://0xcc0xcd.com)中连载,点击进入!

            自2011年6月21日开博至今天2012年12月31日,在这560天里面,主要是做了以下三件事情:

            1. 发表了72篇原创博客,访问量1060200次,评论3153条

            2. 出版了《Android系统源代码情景分析》一书,一共3大篇16章830页1570千字

            3. 被评为2012年度十大杰出博客

            写博客之初,是没有出书的计划的,不过在各方面的巧合之下,就整理了博客上的文章,然后就出版了,不过也算是了却心愿,以后就可以专心地写博客了。下面就简单说一下从写博客以来的一些感受。

            1. 梦想。APP刚刚火起来的那阵子,还没接触过移动开发。有一天听说我们的产品经理自己做了个APP,用来订阅自己感兴趣的视频。顿时倍受打击:连产品经理都会做APP了,作为一个码农,怎么还能对移动开发无动于衷呢?!于是就准备学习移动开发,做个APP来玩玩。但是后来想了一下,其实我更感兴趣的是移动操作系统,很想知道它和PC操作系统有什么区别。于是就带着“了解移动操作系统长什么样子”这个梦想踏上了研究Android的旅程。再啰嗦说一下梦想这个话题。再年轻一些的时候,会觉得谈梦想是一件很扯很遥远很虚无缥缈的事情。随着年纪的增大,年轻时的棱角随着生活中的各种遭遇和压力都慢慢地磨平了,只剩下每天重复的上下班。这时候才发现年轻时的梦想是多么的弥足珍贵:梦想原来是可以让人这么年轻而富有激情的!现在看达人秀的时候,更多的感动是来自那些选手对梦想的执着追求,而不是他们的表演。

            2. 学习。决定了要学习移动操作系统开发以后,接下来就是选平台了。当时iOS和Android都是红透半边天,WP还未成型。由于Android是开放源码的,因此,它就是学习移动操作系统的不二选择了。了解到Android是基于Linux内核来开发之后,就开始看Linux内核的书:《Linux Kernel Development》、《Understanding the Linux Kernel》、《Linux Device Drivers》和《Linux内核源代码情景分析》。这四本书每一本书都至少看过两遍。对Linux内核有了大概的了解之后,就开始学习Android应用开发,因为我觉学习一个新知识的最好切入点就是先知道它是怎么使用的。于是,接下来又看了两本讲Android应用开发的书:《Professional Android Application Development》和《Google Android SDK开发范例大全》。看完了之后,觉得还是有点云里雾里,于是又写了个Android小游戏——交互式人机对战五子棋。说来和五子棋有缘,高中时经常和同学在几何簿上画着来玩玩五子棋,有时上课也偷偷玩;上大学学习C和Java时,也是拿五子棋来练手。在Android上开发的这个五子棋游戏虽小,但却五脏俱全:Activity、Service、Broadcast Receiver和Content Provider四大组件全用上了,异步任务和Binder进程间通信机制等也用上了。这为日后研究Android系统打下了坚实的基础。其实学习这个东西就是这样,它不是快餐,饿了就去吃,必须得老老实实地一步一步地打基础。

            3. 坚持。长期地坚持去做一件事情,真的很难。不过,当你下定决心持续地去做一件事情的时候,你的坚持就会变成一种习惯。习惯一旦养成,你不去做那件事情的时候,反而会觉得心里不舒服,好像少了什么似的。因为平时要上班,所以一天下来,其实也没多少时间去研究Android系统。这时候我就告诉自己,更加要坚持,并且给自己算了一笔数:工作日每天看20页书,周末每天看50页书,大概两周就可以看一本400~500页的书;一天看300行左右代码,一周就能看2000~3000行代码;一天写1个段落的博客,一周也能捣鼓出1篇来。另外,当坚持了一段时间之后,就会发现学习的速度比以前更快了,就好像有一种加速度一样,这时候就会发现事情越做越快。

            4. 自信。自信是很重要的,尤其是在你做一件很有挑战性的事情的时候。如果没有自信,在碰到难以解决的困难时,或许就会放弃了。其实在很多时候,机遇都是偏爱那些有自信并且一直坚持着梦想的人。记得在研究Android系统的UI渲染服务SurfaceFlinger的时候,被一个20多行代码的函数难住了,百思不得其解。后来盯了两三天,联系了各种上下文,最后总算是把它弄明白了。我一直都相信潜意识这种东西:只要你相信你能解决一个问题,并且坚持住不放弃,潜意识就会帮助你去加工和组织各种原始信息。因此,自信很重要,它是一种软实力:有自信不一定能成功,但是没有自信要成功就难上加难。

            5. 淡定。淡定是一种人生态度,它能使你不功利,不浮躁,从容地面对得与失,找到一条更合适自己长远发展的路。往往梦想都是一个比较长期的东西,不是短期内就能看到效益的。在坚持梦想的过程中,又可能要付出很多代价,例如,你没有时间找(陪)老婆或者女朋友,你赚的钱没有一起毕业的同学多,诸如此类的等等事情。这时候,你就更需要淡定:只要你判断你正在做的事情是值得的,你就淡定地面对别人的眼光和周围的环境。我发现写博客以来,自己变得越来越宅了,下班后和周末都更愿意呆在房间里,当渐渐地发现同学都在忙着晒结婚照或者小孩照的时候,自己还在单身着:(。这可能就是宅的代价吧,不过现在对这件事情还是比较淡定:)。

            上述5点感受总结来说就是:心怀梦想,带着自信和淡定,持之以恒,学习、学习,再学习!很讽刺的是,如果是五六年以前的自己看到上面的这些文字,我会觉得很扯,很空洞,没意义。人可能就是要非得亲自去经历一些事情,才能深刻地领会一些道理。

            最后,老罗和大多数人一样,出身草根,也就是俗称的屌丝,如今也是在平凡的职位上做着平凡的事情,但是老罗相信,虽不是官二代富二代,但是拼尽全力地去奋斗,就会有希望!在接下来的2013年里面,老罗仍然会坚持写Android方面的文章,第一目标是继续研究Android系统的UI架构,第二目标是研究Android系统的Dalvik虚拟机。希望大家一如既往地支持《老罗的Android之旅》,同时,如果大家觉得博客的内容有用,还请多多支持老罗的新书《Android系统源代码情景分析》!

            老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! 

    展开全文
  • 本篇博文中我们以一dubbo服务api调用方式开篇,对于dubbo服务发布者从配置,解析、构造URL和发布服务整个流程的源码进行了分析。对于读者能更好的理解dubbo的服务发布过程,其中最核心的概念应该是Dubbo自己封装的...
  • 浅析 - 阿里巴巴专家教你坚持写作

    千次阅读 多人点赞 2020-11-23 01:21:56
    今天分享的产品经理个人成长中,关于为什么坚持写作的思考。 初稿|木深、木小深 编辑|牟深、Sam、Ella 1、前言 你有写作的习惯吗?很多产品经理的回答是:我为什么要写作呢?很多人觉得写作是一件有难度的事情...
  • 本文摘自“光环国际”—中国项目管理PMP培训上市企业 如何带领团队? 如何高效管理时间? 如何处理错综复杂的公共...攻略 了解至少一部门工作进展情况或进行相应指导。 攻略四 考虑一组织的不足之处,并
  • 个三流学校程序员的奋斗

    千次阅读 多人点赞 2012-06-08 14:47:26
    我也在一个三流的学校,在找有关考研的文章的时候看到这篇文章 觉得不错,不敢独享,拿出来共勉……   看完后我又一次明白,勤能补拙,一人的成功,往往在于坚持 没有挫折,不经历艰难的日子,就没有美好的...
  • 1985年出生的他,在OB团队里绝对算是一“老人”,从研究生毕业加入OB至今已经迈入第八...从P5到P8他完成了职业生涯的级跳,也完成了三个阶段的成长和蜕变。机会从来都是留给有准备的人,当然,也总是留给那...
  • 目前供职于某公司的研发部担任软件工程师兼日语(现场/会议)口译,同时在上海交通...使用扇贝网的过程中,有没有什么最难忘的事情? chain: 有关这问题,我想先说说如何认识到扇贝网的吧。记得那是2011年
  • 简单的游戏服务器框架 .

    千次阅读 2013-01-08 00:28:02
    最近一段时间不是很忙,就写了一自己的游戏服务器框架雏形,很多地方还... 服务器这边简单的分为三个部分,客户端的连接首先到达网关服务器,网关这里有线程用来监听来自与客户端的连接,然后在将这些数据发送到
  • 在自我介绍的文章中,说到了自己本科四年,通过自己的探索,挣到了人生的第一 30w,之后有挺多小伙伴加了我微信,好奇问我是如何挣到这 30 万的(因为我不是通过打比赛获得的),并且还能本科还拿到了腾讯提前批 ...
  • 【2020总结】 一直坚持,一路向前!

    万次阅读 2021-01-07 17:17:56
    也是因为这项目今年月份在石家庄某行主场开发了周的时间。 【呼叫中心】 这项目主要是给客户提供拨打线路资源的功能,也就是我们需要一手托两家,一方是线路供应商,一方是客户核心系统。这项目由于前面...
  • 坚持写技术博客一年能有多少收获!

    万次阅读 多人点赞 2020-10-10 08:31:57
    作者:小傅哥 ... 沉淀、分享、成长,让自己和他人都能有所收获!???? 让人怪不好意思的,小傅哥的粉丝破万了!...做公众号的号主都知道粉丝过万是一道不小的门槛,尤其是技术类...这些文章内容构成了一小的生态圈,通过内
  • 分享自己作为一名技术人员,或者说技术背景比较浓厚的创业者的一些经验教训,希望后来的技术创业者能够少走弯路。...大问题 1.技术是万能的。 2.合伙人大多是做技术的。 3.喜欢从头开发项目。 4...
  • 12国外免费DNS服务

    万次阅读 2011-05-21 09:05:00
    12国外免费DNS服务
  • 利用itchat搭建微信机器人详解(附三个实用示例)

    万次阅读 多人点赞 2018-08-02 14:05:53
    取需,三个实用示例:定时发信息,集成图灵API实现聊天机器人,微信防撤回实现,基本够玩了。 另外,微信改版了网页端,很多接口都开始用不了,比如拉人进群,可以通过无障碍服务或者 Xposed来解决,具体怎么玩...
  • 前路漫漫,唯有坚持和保持空杯心态,才能更好得进步,共勉。
  • 而立之年——三线城市程序员的年终告白

    万次阅读 多人点赞 2016-12-23 20:49:54
    30岁(2017-1987),曾经对我来说曾是多么遥远的数字,但它正悄然的离我越来越近。古人云,十而立,而立的意思是自立于世,多指学有所成。 在《于丹的〈论语心得〉》里,“立”是内心的的立,是内在心灵的独立,...
  • 简单的游戏服务器框架

    千次阅读 2013-04-07 12:27:17
    服务器这边简单的分为三个部分,客户端的连接首先到达网关服务器,网关这里有线程用来监听来自与客户端的连接,然后在将这些数据发送到游戏逻辑服务器上,这逻辑游戏服务器上,数据的交互就是通过与数据服务器进
  • 一、FMS(AMS)流媒体服务器介绍: 二、wowza流媒体服务器介绍: 、red5流媒体服务器介绍: 四、SRS流媒体服务器介绍:
  • 晨跑感悟:

    千次阅读 2014-04-20 06:19:46
    三个三是我在风景如画的情侣路晨跑时的感悟,得到很朋友的点赞,当然也有很多的不解,因此我来简单阐释一下,小弟钻研移动互联网多年,如今才开始真正地去努力成为优秀的移动互联网运营和服务商,很多朋友不明我...
  • 如果搞崩溃一rabbitmq服务器

    千次阅读 2018-02-11 23:58:28
    郑重声明:危险动作,切勿在正式运行环境中模仿。你们搞挂了服务器 ,我概不负责。...(sui bian ni men zen me gao dou xing)先讲一下rabbitmq的简单使用方法, rabbitmq相当于一邮局,也就是一中间服务器。 ...
  • 坚定不移地坚持发展的方向 ——任正非在中央研究部干部就职仪式上的讲话 1995年1月9日 一、开发部的改革要为各系统的改革树立榜样 1、新老干部要团结。一方面要看到,长江后浪推前流,新人永远比老人行,后人总要...
  • 个三流大学生的北京

    千次阅读 2006-09-22 10:25:00
    个三流大学生的北京年 又是骄阳似火的七月,今天我拿到了一家世界TOP10的offer,真的很开心。 年前的今天,我只身来到北京,茫然无措,终于在在中关村找到了份网络工程师的工作,其实说白了就是搬交换机,...
  • 从0到1,一普本学生的年学习历程

    万次阅读 多人点赞 2020-04-25 14:56:11
    我是17年开始认识到IT这行业的,至今也快将近年了吧。没错,我现在还在象牙塔(大学),所以这篇我并不会涉及到关于这残酷的社会会带给我什么,因为我也不知道。 这片文章我断断续续写了有些时间了,因为我...
  • 在黔南州中小企业服务中心作了一场《互联网+时代的创业和创新》的讲座,听众很多,大家对创业的渴望以及创新的追求充满了热情和憧憬,真想不到,在这布依族苗族自治州的地方,能遇到这么多有活力有目标的创业创新...
  • 二十又是谁的二十

    千次阅读 2020-12-22 18:43:58
    选自己热爱的行业,做好自己的方向和目标,然后日夜兼程的赶路,浮躁的社会,只要你肯学习,愿意努力,你坚持三个月,就可以做到熟手,你坚持半年就是精英,你坚持一年就是老员工,你坚持三年就是前辈,坚持的时间再...
  • 普通专科生,拿什么拯救你的未来?(精简版)

    万次阅读 多人点赞 2021-03-09 17:05:00
    普通专科生,拿什么拯救你的未来?(精简版) 总有人要赢,为什么不能是我!————— 科比-布莱恩特 原文地址:www.dushunchang.top 此文为小Du博客原创出品 转载,复制请注明原文出处 近来看到一则知乎头条,...
  • 引用Gartner的数据是,全球2017年第季度x86服务器的出货量、销售额分别增长5.3%、16.7%,市场份额最大的3厂商分别是戴尔EMC、惠普和浪潮。看数据,好像全球服务器市场全面复苏,高速增长。看市场份额,前两名...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 93,727
精华内容 37,490
关键字:

五个坚持三服务是什么