Unity 如何使用 NetworkDiscovery 从客户端查找服务器

Unity how to find a server from client using NetworkDiscovery

[我在 C# 工作]

为了决定设备应该成为带有本地客户端的服务器还是单独的客户端(对于无主服务器的网络),我需要在变成一个设备之前找出是否有任何其他可用的服务器如果不是通过从服务器接收 NetworkDiscovery 广播来加入另一个客户端设备,则服务器与本地客户端 - 目前我无法让客户端接收来自服务器的广播。

我已经创建了两个空的游戏对象,每个都有脚本,一个脚本使它成为一个服务器,应该通过 NetworkDiscovery.StartAsServer() 从它的 NetworkDiscovery 广播,但目前我的一个客户端 NetworkDiscovery 有设置为 NetworkDiscovery.StartAsClient() 未调用 OnRecievedBroadcast() 函数,因此未从服务器接收广播。

下面显示的两个脚本是客户端和服务器:

客户 -

using UnityEngine;
using System.Collections;
using UnityEngine.Networking;

public class SearchForServers : MonoBehaviour {
    bool serverIsFound;
    NetworkDiscovery NetworkDiscovery;
    // Use this for initialization
    void Start () {
        serverIsFound = false;
        NetworkClient Client = new NetworkClient();
        NetworkDiscovery = gameObject.AddComponent<NetworkDiscovery>();
        NetworkDiscovery.Initialize();
        NetworkDiscovery.StartAsClient();
    }

    void OnRecievedBroadcast(string fromAdress, string data)
    {
        serverIsFound = true;
    }

    // Update is called once per frame
    void Update () {
        Debug.Log("Server Found = " + serverIsFound);
    } 
}

服务器 -

    using UnityEngine;
using System.Collections;
using UnityEngine.Networking;

public class CreateServer : MonoBehaviour
{
    bool create;
    int minPort = 10000;
    int maxPort = 10010;
    int defaultPort = 10000;
    NetworkDiscovery NetworkDiscovery;

    void Start()
    {
        create = true;
        if (create == true)
        {
            int serverPort = createServer();
            if (serverPort != -1)
            {
                Debug.Log("Server created on port : " + serverPort);
            }
            else
            {
                Debug.Log("Failed to create Server");
            }
        }
        NetworkDiscovery = gameObject.AddComponent<NetworkDiscovery>();
        NetworkDiscovery.Initialize();
        NetworkDiscovery.StartAsServer();
    }


    //Creates a server then returns the port the server is created with. Returns -1 if server is not created
    int createServer()
    {
        int serverPort = -1;
        //Connect to default port

      bool serverCreated = NetworkServer.Listen(defaultPort);
        if (serverCreated)
        {
            serverPort = defaultPort;
            Debug.Log("Server Created with default port");
        }
        else
        {
            Debug.Log("Failed to create with the default port");
            //Try to create server with other port from min to max except the default port which we trid already
            for (int tempPort = minPort; tempPort <= maxPort; tempPort++)
            {
                //Skip the default port since we have already tried it
                if (tempPort != defaultPort)
                {
                    //Exit loop if successfully create a server
                    if (NetworkServer.Listen(tempPort))
                    {
                        serverPort = tempPort;
                        break;
                    }

                    //If this is the max port and server is not still created, show, failed to create server error
                    if (tempPort == maxPort)
                    {
                        Debug.LogError("Failed to create server");
                    }
                }
            }
        }
        return serverPort;
    }
}

这些是带有调试日志的控制台日志

感谢阅读我希望您能意识到我哪里做错了,或者如何才能完成上述任务。 @程序员

首先,您将每个服务器和客户端脚本命名为相同的名称。服务器代码中不需要 OnRecievedBroadcast 。您只需要在客户端代码中使用它。 OnRecievedBroadcast 未在客户端调用,因为您没有覆盖 NetworkDiscovery。您必须覆盖它。

这是一个简单的发现代码:

客户:

public class NetClient : NetworkDiscovery
{

    void Start()
    {
        startClient();
    }

    public void startClient()
    {
        Initialize();
        StartAsClient();
    }

    public override void OnReceivedBroadcast(string fromAddress, string data)
    {
         Debug.Log("Server Found");
    }
}

服务器:

public class NetServer : NetworkDiscovery
{
    // Use this for initialization
    void Start()
    {
        Application.runInBackground = true;
        startServer();
    }

    //Call to create a server
    public void startServer()
    {
        int serverPort = createServer();
        if (serverPort != -1)
        {
            Debug.Log("Server created on port : " + serverPort);
            broadcastData = serverPort.ToString();
            Initialize();
            StartAsServer();
        }
        else
        {
            Debug.Log("Failed to create Server");
        }
    }

int minPort = 10000;
int maxPort = 10010;
int defaultPort = 10000;

//Creates a server then returns the port the server is created with. Returns -1 if server is not created
private int createServer()
{
    int serverPort = -1;
    //Connect to default port
    bool serverCreated = NetworkServer.Listen(defaultPort);
    if (serverCreated)
    {
        serverPort = defaultPort;
        Debug.Log("Server Created with deafault port");
    }
    else
    {
        Debug.Log("Failed to create with the default port");
        //Try to create server with other port from min to max except the default port which we trid already
        for (int tempPort = minPort; tempPort <= maxPort; tempPort++)
        {
            //Skip the default port since we have already tried it
            if (tempPort != defaultPort)
            {
                //Exit loop if successfully create a server
                if (NetworkServer.Listen(tempPort))
                {
                    serverPort = tempPort;
                    break;
                }

                //If this is the max port and server is not still created, show, failed to create server error
                if (tempPort == maxPort)
                {
                    Debug.LogError("Failed to create server");
                }
            }
        }
    }
    return serverPort;
}
}

createServer() 函数是您上一个问题的函数。我不认为您可以在编辑器中同时拥有服务器和客户端代码 运行ning。

为了进行测试,您必须 在启用服务器 code/NetServer 的电脑中构建代码。 运行 构建的程序然后从您的编辑器中您可以 运行 client/NetClient 代码。这应该在服务器上发现游戏。