我需要在本地网络中使用服务器实现游戏,但无法访问 Internet。
假设我可以处理客户端和服务器之间的连接和网络通信(如果它们已连接),我想知道是否有一种优雅的方式让客户端在启动时发现服务器的地址。
我提供我的方法作为答案,以便分享知识,但很高兴看看是否有更优雅/自动的方法。
最佳答案
客户端将使用特定端口连接到游戏服务器。我在不同的端口实现了 UDP 多播,以便客户端可以获得服务器的 IP。
以下代码适用于服务器和客户端,使用 Unity Javascript 编写。关于 服务器 端,它将开始每秒在端口 5100 发送多播消息。客户将监听相同的端口,直到检测到新消息。然后他们识别发件人的 IP 并以 Unity3d 方式建立客户端-服务器连接。
private var server_port : int = 5000;
private var server_ip : String;
// multicast
private var startup_port : int = 5100;
private var group_address : IPAddress = IPAddress.Parse ("224.0.0.224");
private var udp_client : UdpClient;
private var remote_end : IPEndPoint;
function Start ()
{
// loaded elsewhere
if (station_id == "GameServer")
StartGameServer ();
else
StartGameClient ();
}
function StartGameServer ()
{
// the Unity3d way to become a server
init_status = Network.InitializeServer (10, server_port, false);
Debug.Log ("status: " + init_status);
StartBroadcast ();
}
function StartGameClient ()
{
// multicast receive setup
remote_end = IPEndPoint (IPAddress.Any, startup_port);
udp_client = UdpClient (remote_end);
udp_client.JoinMulticastGroup (group_address);
// async callback for multicast
udp_client.BeginReceive (new AsyncCallback (ServerLookup), null);
MakeConnection ();
}
function MakeConnection ()
{
// continues after we get server's address
while (!server_ip)
yield;
while (Network.peerType == NetworkPeerType.Disconnected)
{
Debug.Log ("connecting: " + server_ip +":"+ server_port);
// the Unity3d way to connect to a server
var error : NetworkConnectionError;
error = Network.Connect (server_ip, server_port);
Debug.Log ("status: " + error);
yield WaitForSeconds (1);
}
}
/******* broadcast functions *******/
function ServerLookup (ar : IAsyncResult)
{
// receivers package and identifies IP
var receiveBytes = udp_client.EndReceive (ar, remote_end);
server_ip = remote_end.Address.ToString ();
Debug.Log ("Server: " + server_ip);
}
function StartBroadcast ()
{
// multicast send setup
udp_client = UdpClient ();
udp_client.JoinMulticastGroup (group_address);
remote_end = IPEndPoint (group_address, startup_port);
// sends multicast
while (true)
{
var buffer = Encoding.ASCII.GetBytes ("GameServer");
udp_client.Send (buffer, buffer.Length, remote_end);
yield WaitForSeconds (1);
}
}
将此附加到您的
GameObject
应该做的伎俩。
关于client-server - Unity3d 服务器自动发现,仅限局域网,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16110014/