网络游戏编程 - Socket 技术以及应用 - 上 -《了解游戏网络基础知识》
网络游戏编程 - Socket 技术
前言:
在现今互联网如此发达地情况下,学习网络编程是必不可少的一部分,特别是游戏开发领域,在中国市场网络游戏地比例明显高于单机游戏,那么学习网络游戏编程就成了必不可少的一部分,(那个Unity的物品管理系统可能得再拖两天,最近太忙了)
计算机网络
那么什么是Socket呢,Socket 也叫 套接字,是一种网络通讯的技术,那么在学习Socket之前我们先了解一下简单的计算机网络知识,那么我问大家一个问题:
你是如何与另外一台计算机进行通讯的呢?
想象一下,你想从北京寄一封信给上海的朋友。
写信(数据):
你写好信的内容。这相当于计算机A要发送的数据(比如一封电子邮件、一张图片)。
装信封(封装):
你把信纸装进一个信封里。在计算机世界里,这个过程叫做封装。数据会被加上一个“信封”,这个信封上包含重要的地址信息。
写地址(IP地址和端口):
你在信封上写上收件人的详细地址(上海市XX路XX号) 和姓名(张三),以及你自己的地址。
详细地址 相当于 IP地址。它唯一地标识了网络上的哪一台设备(就像地址标识了哪一栋房子)。
姓名 相当于 端口号。一栋房子(计算机)里可能住着不同的人(不同的应用程序,如浏览器、微信、游戏)。端口号指定了数据要交给计算机上的哪个具体程序。
交给邮局(通过网卡和路由器):
你把信投递到当地的邮局。邮局会根据地址决定如何运送这封信,它可能会经过多个中转站。
你的计算机通过网卡将数据发送出去。
网络中的路由器就相当于邮局和中转站。它们检查数据包上的目标IP地址,并决定下一步将它发送到哪个方向,最终一步步地将数据包导向目标计算机。
收信(解封装):上海的朋友收到信后,打开信封,取出信纸阅读。
目标计算机B收到数据包后,会一层层“拆开信封”(解封装),根据端口号将数据交给正确的应用程序(比如你的电子邮件客户端),然后程序再将数据呈现给用户。
这个过程就会是一个简单的端对端的实现
客户端 && 服务端
现在我们已经可以实现端对端的效果实现,那么比方说两个客户端要互传数据那么就必须要熟悉对方的地址,这个时候对于一些没有计算机基础的用户就很不友好,必须要知道对方的IP地址才能和对方玩游戏,这个很不科学对吧,那么我们就引出了服务端这个概念:
服务端:
服务端就是接收所有客户端的端口,他本质和客户端没有区别,它同样也是一台设备,同样也有IP地址,只是它的作用和客户端不同的是:服务端并不会运行游戏,他只负责传送并处理玩家的信息,而客户端负责的是向服务器发送信息,和处理游戏逻辑,那么客户端和服务端的区别一下子就明了了,服务端相当于一个中转站
客户端:
客户端只需要向服务端传送自己需要传送给服务端的信息就可以了,但是客户端还需要处理游戏的主要逻辑,那么处理逻辑的过程中不断地向服务端发送自己的信息,并且还需要开启子线程来听取服务端发送来的信息:
我们来模拟一个场景:
1.我开了一把CS2(FPS射击游戏)并且匹配成功并进入游戏了
2.每个玩家的电脑程序都会向服务端发送自己位于地图中的位置,当前武器,是否开火等等
3.那么服务端一般会将所有玩家的信息整合成一个表发送给在当前游戏的所有玩家(当然CS2不一定是这样的毕竟我没看过代码)
4.然后客户端会将玩家们渲染出来,通过什么?当然是通过服务器传来的信息,渲染出当前玩家用的什么皮肤,做的什么动作,面向什么方向,在那个位置,有没有被打之类的信息
多线程
如果是以上场景的话那么一般来说,服务端对于CPU内存的压力就会比较大,
为什么?因为我们需要多个线程来连接玩家和监听该客户的信息,为什么需要多线程,
大家可以想象一下线程就是一个流水线,一个流水线上执行人物必须按顺序来,但是不可能等一个一个用户按顺序来,必须需要服务器单独对每一个用户开一个流水线来处理每个用户的信息,所以对于大型游戏的服务器都是非常强大的性能怪兽,正常来说价值人民币 20 - 100 万并且还需要维护,有钱的公司甚至会花10万人民币来维护服务器。
TCP (传输控制协议)
是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。它确保数据在传输过程中不丢失、不重复,并且按顺序到达。TCP的主要特点包括:
-
连接导向:在数据传输之前,TCP需要建立连接(通过三次握手)。
-
可靠性:TCP提供可靠的数据传输服务,确保数据完整性和顺序。
-
双向数据流:支持双向数据流,允许同时发送和接收数据。
TCP是互联网协议套件中的核心协议之一,广泛应用于各种网络应用中
具体大家可以看这个
结语
这个就是一个游戏服务器所需要的了解的知识了。那么最近可能没办法说一直更新,因为确实要上课,写文章也是有时间写一些,最近开发的新的联网射击游戏花费了我 两周的时间,突发奇想来写一篇Socket 的文章,下一章我们再开始写代码,这些基础知识是必须的。所以大家还是先看一下。