简体   繁体   English

Unity Client未连接到主机

[英]Unity Client not connecting to host

I'm trying to connect a network client to a host using unity but I'm getting false returned through the debug check Debug.Log(myClient.isConnected.ToString()); 我正在尝试使用unity将网络客户端连接到主机,但是通过调试检查Debug.Log(myClient.isConnected.ToString());却返回了false Debug.Log(myClient.isConnected.ToString()); . I'm creating a new client and connecting with the method setupClient() but I guess I'm doing something incorrectly. 我正在创建一个新客户端并与方法setupClient()连接,但是我想我做错了什么。 How can I fix this? 我怎样才能解决这个问题? Am I debugging this correctly? 我可以正确调试吗?

using System.Collections;
using System.IO;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.Networking.NetworkSystem;

public class MyMsgType
{
    public static short texture = MsgType.Highest + 1;
};

//Create a class that holds a variables to send
public class TextureMessage : MessageBase
{
    public byte[] textureBytes;
    public string message = "Test Received Message"; //Optional
}

public class UNETChat : Chat
{
    NetworkClient myClient;
    public Texture2D previewTexture;
    string messageToSend = "Screen Short Image";

    private void Start()
    {
        //if the client is also the server
        if (NetworkServer.active) 
        {
            // Register to connect event
            myClient.RegisterHandler(MsgType.Connect, OnConnected);
            // Register to texture receive event
            myClient.RegisterHandler(MyMsgType.texture, OnTextureReceive);
        }
        setupClient();
    }

    public void DoSendTexture()
    {
        StartCoroutine(TakeSnapshot(Screen.width, Screen.height));
    }

    WaitForEndOfFrame frameEnd = new WaitForEndOfFrame();

    public IEnumerator TakeSnapshot(int width, int height)
    {
        yield return frameEnd;

        Texture2D texture = new Texture2D(800, 800, TextureFormat.RGB24, true);
        texture.ReadPixels(new Rect(0, 0, 800, 800), 0, 0);
        texture.LoadRawTextureData(texture.GetRawTextureData());
        texture.Apply();

        Debug.Log("Texture size is : " + texture.EncodeToPNG().Length);

        sendTexture(texture, messageToSend);

        // gameObject.renderer.material.mainTexture = TakeSnapshot;
    }

    //Call to send the Texture and a simple string message
    public void sendTexture(Texture2D texture, string message)
    {
        TextureMessage msg = new TextureMessage();

        //Convert Texture2D to byte array
        msg.textureBytes = texture.GetRawTextureData();
        msg.message = message;

        NetworkServer.SendToAll(MyMsgType.texture, msg);

        Debug.Log("Texture Sent!!");
    }

    // Create a client and connect to the server port
    public void setupClient()
    {
        Debug.Log("Setup Client");
        //Create new client
        myClient = new NetworkClient();
        //Register to connect event
        myClient.RegisterHandler(MsgType.Connect, OnConnected);
        //Register to texture receive event
        myClient.RegisterHandler(MyMsgType.texture, OnTextureReceive);
        //Connect to server
        myClient.Connect("localhost", 4444);

        Debug.Log(myClient.isConnected.ToString());
    }

    //Called when texture is received
    public void OnTextureReceive(NetworkMessage netMsg)
    {
        TextureMessage msg = netMsg.ReadMessage<TextureMessage>();

        //Your Received message
        string message = msg.message;

        Debug.Log("Texture Messsage " + message);

        //Your Received Texture2D
        Texture2D receivedtexture = new Texture2D(4, 4);
        receivedtexture.LoadRawTextureData(msg.textureBytes);
        receivedtexture.Apply();
    }

    public void OnConnected(NetworkMessage netMsg)
    {
        Debug.Log("Connected to server");
    }
}

Am I debugging this correctly? 我可以正确调试吗?

No, and you are not using NetworkClient.isConnected correctly. 否,并且您没有正确使用NetworkClient.isConnected

The NetworkClient.Connect function is asynchronous which means that when you call it, it does not wait or block for that connection to actually connect. NetworkClient.Connect函数是异步的,这意味着当您调用它时,它不会等待或阻止该连接实际连接。 It uses a Thread to do the connection and when you use NetworkClient.isConnected right after calling NetworkClient.Connect , you will get unexpected result. 它使用线程进行连接,并且在调用NetworkClient.Connect之后立即使用NetworkClient.isConnected时,将会得到意外的结果。

NetworkClient notifies you with a callback function when it is connected. 连接时, NetworkClient会通过回调函数通知您。 The callback function is registered with the NetworkClient.RegisterHandler and MsgType.Connect . 回调函数已在NetworkClient.RegisterHandlerMsgType.Connect注册。 In your case, it is registered to the OnConnected function so OnConnected should be called when you are connected to the network. 在您的情况下,它已注册到OnConnected函数,因此在您连接到网络时应调用OnConnected

You either have to start a coroutine and use NetworkClient.isConnected inside that coroutine function to wait for the connection like this: 您要么必须启动一个协程,然后在该协程函数中使用NetworkClient.isConnected来等待这样的连接:

while(!NetworkClient.isConnected)
{
    Debug.Log("Waiting for Connection");
    yield return null;
}
Debug.Log("Connected");

or use the callback function ( OnConnected ) to detect when the client is connected. 或使用回调函数( OnConnected )检测客户端何时连接。


Unrelated but it would be extremely useful to also subscribe to Error and Disconnect events too. 无关,但同时也订阅Error和Disconnect事件将非常有用。 These are important when troubleshooting your network code. 在对网络代码进行故障排除时,这些很重要。

myClient.RegisterHandler(MsgType.Error, OnError);
myClient.RegisterHandler(MsgType.Disconnect, OnDisconnect);

... ...

private void OnError(NetworkMessage netMsg)
{
    ErrorMessage error = netMsg.ReadMessage<ErrorMessage>();
    Debug.Log("Error while connecting: " + error.errorCode);
}

private void OnDisconnect(NetworkMessage netMsg)
{
    ErrorMessage error = netMsg.ReadMessage<ErrorMessage>();
    Debug.Log("Disconnected: " + error.errorCode);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM