Master Server
主服务器
主服务器是一个积极响应客户端的集中地,他注视着要连接他的用户。其目的是为了使隐藏的IP地址和端口也能够建立网络连接。就像防火墙处理和NAT穿透。
每个单独的服务器上运行的游戏提供一个游戏类型到主服务器。所有相同类型的游戏集中在一起,方便兼容的客户方便的访问他们。当玩家连接并查看与之配套的游戏类型时,使玩家在服务器上看到有用的信息。以帮助玩家判断哪个服务器可以连接。这包括游戏名称,玩家数量,是否有密码等等。用来传输这些数据的函数是面向服务器端的MasterServer.RegisterHost() 和面向客户端的 MasterServer.RequestHostList() 。
中间还有四段(略)
注册一个游戏
注册一个游戏之前,比较重要的是正确设置NAT,它取决于主机的网络功能,用Network.useNat的true或false进行定义。游戏主机需要知道他是否有NAT地址,并且游戏端口是否连接在公共网络。所以在游戏之前他将表明是否需要NAT支持。
服务器也许会开始于于此类似的代码:
function OnGUI() {
if (GUILayout.Button ("Start Server"))
{
// Use NAT punchthrough if no public IP present
Network.useNat = !Network.HavePublicAddress();
Network.InitializeServer(32, 5555);
MasterServer.RegisterHost("MyUniqueGameType", "JohnDoes game", "l33t game for all");
}
}
在这里,我们决定是否需要NAT穿透,机器是否公有IP。有一个函数Network.TestConnection(),可以告诉我们主机是否可以NAT。它同时连接公网IP,测试是否有防火墙阻止了游戏端口。有公网IP的主机会跃过NAT测试,如果测试失败主机将不能连接NAT客户端。在这种情况下,用户需要知道,他可能需要建立端口转发。通常人们会有一个NAT地址,不能设置端口转发(因为没有一个专有的公网IP)。这种情况下,如果NAT测试失败,用户会被告知,运行服务器是不行的,如本地网络的客户端是不能连接的。
如果一个主机允许NAT功能而不去用,并没有危害,它仍然可以连接。但是,不能实现NAT穿越的客户端将不能连接到主机,如果它开启NAT的话。
连接到游戏
主机信息,主机数据,对象在登记或查询时包括如下信息:
boolean useNat Indicates if the host uses NAT punchthrough. // 表示如果主机使用NAT穿越
String gameType The game type of the host. // 主机类型
String gameName The game name of the host. // 主机名称
int connectedPlayers The amount of currently connected players/clients. // 当前连接的用户/客户端数量
int playerLimit The maximum amount of allowed concurrent players/clients. // 最大连接数量
String[] IP The internal IP address of the host. On a server with a public address the external and internal addresses are the same. This is an array as when connecting internally, all the IP addresses associated with all the active interfaces of the machine need to be checked. // 主机的内部IP地址。在具有公网IP地址的服务器的外部和内部地址是相同的。内部连接时他是一个数组,与IP地址相关的所有机器的活动接口都需要被查阅。
int port The port of the host. // 主机的端口
boolean passwordProtected Indicates if you need to supply a password to be able to connect to this host. // 提示您是否需要提供密码才能链接到这台主机。
String comment Any comment which was set during host registration. // 主机注册时的注释
这些信息用于正确连接客户端到主机。例如:是否具备NAT穿越。常规的穿越像这样:
function Awake() {
MasterServer.RequestHostList("MadBubbleSmashGame");
}
function OnGUI() {
var data : HostData[] = MasterServer.PollHostList();
// Go through all the hosts in the host list
for (var element in data)
{
GUILayout.BeginHorizontal();
var name = element.gameName + " " + element.connectedPlayers + " / " + element.playerLimit;
GUILayout.Label(name);
GUILayout.Space(5);
var hostInfo;
hostInfo = "[";
for (var host in element.ip)
hostInfo = hostInfo + host + ":" + element.port + " ";
hostInfo = hostInfo + "]";
GUILayout.Label(hostInfo);
GUILayout.Space(5);
GUILayout.Label(element.comment);
GUILayout.Space(5);
GUILayout.FlexibleSpace();
if (GUILayout.Button("Connect"))
{
// Set NAT functionality based on the host information
Network.useNat = element.useNat;
if (Network.useNat)
print("Using Nat punchthrough to connect to host");
else
print("Connecting directly to host");
Network.Connect(element.ip, element.port);
}
GUILayout.EndHorizontal();
}
}
这个例子打印出所有主服务器返回主机的相关信息。其他的有用的数据,像ping信息或者主机的地理位置可以被加载到这里。
NAT穿越
要知道NAT穿越并不是100%都能工作,所以某些机器并不合适做服务器或客户端。
默认情况下NAT穿越是通过主服务器的帮助来完成的,但这个功能并不需要依靠主服务器。调解器是一个真正用于NAT穿越的程序。假如有两台机器连接到调解器,一个可以直接连接到另一个如同连接外部IP和端口同样的时间。主服务器是用来提供这种外部难以定位的IP和端口信息的。这就是为什么主服务器和调解器要如此紧密的结合起来。主服和调解器有相同的默认IP,改变它用MasterServer.ipAddress, MasterServer.port, Network.natFacilitatorIP 和 Network.natFacilitatorPort。
高级
主服是一个完全独立的实体。它可以部署到windows Linux macOS。unity技术提供一个专门的主服给所有人使用。
可能有情况下,你想知道如何修改主服的处理信息,如何进行通信。或许你需要去做一些优化,如何从主服向个别游戏服务器处理主机数据。也许你需要限制主机收到的列表,无论是数字或通过一些实物,如过滤器的位置。这主要是宽带的优化。只要大家相互团结,妥善沟通,所有事情都可以做到。
要执行任何这些修改,您必须建立,部署和托管您自己的主服务器。有关如何执行此操作可以在主服务器生成页面上找到。
|