Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Network programming 什么样的套接字服务器协议是有效的?_Network Programming_Client Server_Protocols_Multiplayer - Fatal编程技术网

Network programming 什么样的套接字服务器协议是有效的?

Network programming 什么样的套接字服务器协议是有效的?,network-programming,client-server,protocols,multiplayer,Network Programming,Client Server,Protocols,Multiplayer,当我为一个简单的客户机-服务器多人游戏编写一个简单的服务器时,我想到了以下使用翻译库的基于文本的协议。基本上,每个命令都有一定的含义,例如: 1 = character starts turning right 2 = character starts turning left 3 = character stops turning 4 = character starts moving forward 5 = character stops moving 6 = character telep

当我为一个简单的客户机-服务器多人游戏编写一个简单的服务器时,我想到了以下使用翻译库的基于文本的协议。基本上,每个命令都有一定的含义,例如:

1 = character starts turning right
2 = character starts turning left
3 = character stops turning
4 = character starts moving forward
5 = character stops moving
6 = character teleports to x, y
因此,客户只需广播以下内容,告知玩家正在向前移动并右转:

4
1
或者,要传送到100x200:

6#100#200
其中#是参数分隔符

套接字连接将连接到播放器标识符,因此不必通过协议广播标识符来知道消息属于哪个播放器

当然,所有数据都将在服务器端进行验证,但这是另一个主题

现在,这对我来说似乎相当有效,只需2个字节就可以通知服务器我正在前进并右转

然而,我看到的大多数“专业”代码片段似乎都在发送对象或xml命令。对我来说,这似乎需要更多的服务器资源,不是吗

为什么我的基于文本的协议会有效率,这是我未经经验的逻辑吗?或者什么是实时动作多人游戏的推荐协议


我想设置一个尽可能高效的协议,因为我不想使用多个集群/服务器来覆盖我的2D多人游戏的过多带宽,也不想解决安全的同步问题和麻烦。

您需要了解发送数据时涉及的延迟。如果收到这些数据包之间的时间与发送数据包之间的时间不同,“开始转向”/“停止转向”的效果会降低

我不能代表所有的游戏,但当我完成这类代码时,我们会通过网络发送方向和位置信息。通过这种方式,接收器可以进行平滑和外推(根据已知的旧数据,计算出对象应该“现在”在哪里)。不同的游戏需要发送不同的数据,但一般来说,您需要弄清楚如何使接收方的数据显示与发送方的数据显示相匹配,因此您需要发送在网络问题面前具有弹性的数据


此外,许多游戏使用UDP进行此类数据传输,而不是TCP。UDP不可靠,因此您可能无法获取所有数据包。这意味着“现在停止移动”或“现在开始移动”可能不会成对接收。在UDP之上进行编码时,更重要的是要经常发送“这是当前状态”,以便客户端有足够的机会进行同步。

您需要了解发送数据所涉及的延迟。如果收到这些数据包之间的时间与发送数据包之间的时间不同,“开始转向”/“停止转向”的效果会降低

我不能代表所有的游戏,但当我完成这类代码时,我们会通过网络发送方向和位置信息。通过这种方式,接收器可以进行平滑和外推(根据已知的旧数据,计算出对象应该“现在”在哪里)。不同的游戏需要发送不同的数据,但一般来说,您需要弄清楚如何使接收方的数据显示与发送方的数据显示相匹配,因此您需要发送在网络问题面前具有弹性的数据


此外,许多游戏使用UDP进行此类数据传输,而不是TCP。UDP不可靠,因此您可能无法获取所有数据包。这意味着“现在停止移动”或“现在开始移动”可能不会成对接收。在UDP之上进行编码时,更重要的是要经常发送“这是当前状态”,以便客户端有足够的机会进行同步。

常用的方法是使用二进制格式,而不是文本,而不是xml。因此,只需一个字节,就可以表示256个不同命令中的一个

也使用UDP而不是TCP。在数据包丢失的情况下,游戏将更加响应UDP。在数据包丢失的情况下,您仍然可以推断移动情况。每个数据包发送一个数据包编号,以便服务器知道命令何时发送

我强烈建议您下载,在那里您可以了解更多有关现代多人游戏中网络编程的信息。它真的很容易阅读和理解

编辑: 我差点忘了。。
当发送复杂的数据结构时,谷歌的帮助很大。

常用的方法是使用二进制格式,而不是文本,而不是xml。因此,只需一个字节,就可以表示256个不同命令中的一个

也使用UDP而不是TCP。在数据包丢失的情况下,游戏将更加响应UDP。在数据包丢失的情况下,您仍然可以推断移动情况。每个数据包发送一个数据包编号,以便服务器知道命令何时发送

我强烈建议您下载,在那里您可以了解更多有关现代多人游戏中网络编程的信息。它真的很容易阅读和理解

编辑: 我差点忘了。。 当发送复杂的数据结构时,谷歌的帮助很大

然而,大多数“专业”代码 我看到的片段似乎正在发送 对象或xml命令。这似乎是 需要更多的服务器资源才能 我,不是吗

是我没有经验的逻辑,为什么我 基于文本的协议将是有效的 有缺陷的或者推荐什么 实时操作协议 多人游戏

发送纯文本比发送包含相同信息的二进制格式更昂贵。例如,如果只发送1个字节,则只能发送10个不同的命令,数字为0到9。二进制格式可以发送尽可能多的不同命令,只要一个字节中有不同的值,即256

因此,尽管您认为对象很大,但实际上它们几乎总是小于同一对象的纯文本表示。通常,它们在没有co的情况下尽可能小
private const MOVE_RIGHT:int = 0; 
private const MOVE_LEFT:int = 1;
private const MOVE_UP:int = 2;
private const MOVE_DOWN:int = 3;

function processData(e:event.data)
{
    switch (e)
    {
       case MOVE_RIGHT:
       //move the clients player to the right

       case MOVE_LEFT:
       //move the clients player to the left

       case MOVE_UP:
       //move the clients player to the up

       case MOVE_DOWN:
       //move the clients player to the down

    }
}