如何统一使用光子网络连接到我们自己的专用服务器?(自托管)

Posted

技术标签:

【中文标题】如何统一使用光子网络连接到我们自己的专用服务器?(自托管)【英文标题】:How to connect to our own dedicated server using photon networking in unity?(Self-hosted) 【发布时间】:2021-10-27 08:50:31 【问题描述】:

在下面的脚本中,我试图将我的游戏与我自己的服务器连接起来。但是每次我得到一个像

这样的错误

-(JoinRandomRoom 失败。客户端在 MasterServer 上(必须是 Master Server 才能进行匹配)但尚未准备好操作(状态:ConnectingToMasterServer)。等待回调:OnJoinedLobby 或 OnConnectedToMaster。)

请检查我下面的脚本并检查有什么问题。

[SerializeField] private GameObject FindOppenentTxt = null;
[SerializeField] private GameObject waitingStatusPanel = null;
[SerializeField] private Text waitingStatusText = null;

private bool isConnnecting = false;

[SerializeField]
private const string GameVersion = "1.1";

private const int maxPlayer = 2;

private string masterServerAddress = "**********";
private int port = 7777;
private string appID = "*************7d645e794534";

private void Awake()

    PhotonNetwork.AutomaticallySyncScene = true;


private void strart()

    PhotonNetwork.SendRate = 20;
    PhotonNetwork.SerializationRate = 5;
    PhotonNetwork.ConnectToMaster(masterServerAddress, port, appID);
    //PhotonNetwork.ConnectUsingSettings();


public void FindOpponent()

    isConnnecting = true;
    FindOppenentTxt.SetActive(false);
    waitingStatusPanel.SetActive(true);
    waitingStatusText.text = "Searching...";

    if(PhotonNetwork.IsConnected)
    
        PhotonNetwork.JoinRandomRoom();
        Debug.Log("findingRoom");
    
    else
    
        //PhotonNetwork.CreateRoom(null, new RoomOptions  MaxPlayers = maxPlayer );
        Debug.Log("creatingRoom");
        PhotonNetwork.GameVersion = GameVersion;
        //PhotonNetwork.ConnectUsingSettings();
        PhotonNetwork.ConnectToMaster(masterServerAddress, port, appID);
        Debug.Log(PhotonNetwork.CurrentRoom);
    


public override void OnConnectedToMaster()

    if(isConnnecting)
    
        PhotonNetwork.JoinRandomRoom();
        Debug.Log("Server IP: " + PhotonNetwork.ServerAddress);
    


public override void OnDisconnected(DisconnectCause cause)

    waitingStatusPanel.SetActive(false);
    FindOppenentTxt.SetActive(true);
    Debug.Log("disconnected");


public override void OnJoinRandomFailed(short returnCode, string message)

    Debug.Log("There are no clients");
    PhotonNetwork.CreateRoom(null, new RoomOptions  MaxPlayers = maxPlayer );


public override void OnJoinedRoom()

    Debug.Log("Joined a room ssuccessfully");
    int playerCount = PhotonNetwork.CurrentRoom.PlayerCount;
    if(playerCount != maxPlayer)
    
        waitingStatusText.text = "waiting for an opponent";
    
    else
    
        waitingStatusText.text = "Opponent Found...please wait..";
    


public override void OnPlayerEnteredRoom(Player newPlayer)

    if (PhotonNetwork.CurrentRoom.PlayerCount == maxPlayer)
    
        PhotonNetwork.CurrentRoom.IsOpen = false;
        waitingStatusText.text = "opponent in room";

        PhotonNetwork.LoadLevel("MainScene");
    

【问题讨论】:

您是否验证了您的自托管 Photon 服务器实际上正在运行?测试客户端可以连接到它吗?与服务器在同一台机器上运行的 Unity 客户端可以连接到它吗?您是否配置了服务器计算机的防火墙和路由器,以允许指定端口和协议上的传入连接通过?您是否已将服务器配置为实际侦听指定非默认端口上的传入连接? 您使用的是 Photon Server v4 还是 v5?对于 v5,要连接的服务器类型应该是名称服务器,而不是主服务器。但是,主服务器是 v4 的正确服务器类型。您是否按照doc.photonengine.com/en-us/server/current/getting-started/… 的指南进行操作? 【参考方案1】:

首先strart 应该是Start .... 否则它永远不会被调用。


然后 afaik 为了能够加入/创建房间,您首先必须在 大厅

所以你应该使用PhotonNetwork.JoinLobby()(或PhotonNetwork.JoinLobby(TypedLobby)),然后听MonoBehaviourPunCallbacks.OnJoinedLobby,例如

public override void OnConnectedToMaster()

    Debug.Log("Server IP: " + PhotonNetwork.ServerAddress);

    if(isConnnecting)
    
        Debug.Log("joining default lobby ...");
        PhotonNetwork.JoinLobby();
    


public override void OnJoinedLobby()

    Debug.Log("Joined Lobby!");

    Debug.Log("Trying to join random room ...")
    PhotonNetwork.JoinRandomRoom();

另见Matchmaking and Lobby

【讨论】:

我遵循了您的陈述,并且遵循了所有文档,但仍然无法找到我的解决方案。你有任何教程或步骤或任何东西,以便我可以轻松理解并可以将我的游戏连接到我自己的服务器。 我唯一的目标是使用 IP 地址和端口连接到我自己的服务器。此外,当我尝试使用光子服务器连接时,它工作正常。当我把这些IP地址和端口。它不工作。 这个答案不正确。客户必须在大厅内才能加入房间。加入随机房间可以正常工作,而无需在大厅内。只有在大厅内才能获取自动更新本地可用房间列表的房间列表事件。但是,也可以手动调用 GetRoomList 操作来接收大厅外的房间列表更新。 @Kaiserludi 嗨,谢谢你的回复,你能告诉我上面提到的网络脚本需要哪些修改吗?如果您有任何脚本或步骤,请与我分享。提前致谢。 @SurajSharma:请阅读我在您的问题下的评论以进行检查。如果在连接到 Photon Cloud 时工作正常,我认为问题的根源不在脚本内部。所以这很可能是服务器配置的问题。

以上是关于如何统一使用光子网络连接到我们自己的专用服务器?(自托管)的主要内容,如果未能解决你的问题,请参考以下文章

Android 10 / API 29:如何将手机连接到配置的网络?

阿里云 经典网络使用ClassicLink连接到专用网络后,192.168网段需要添加路由

怎么在Ubuntu下搭建服务器

vmware 设置访客静态 ip 地址,主机通过 3G 调制解调器连接到专用网络

使用 *** 从 Docker 容器内访问专用网络中的资源

AWS Lambda不支持连接到专用租赁VPC中的资源