【问题标题】:Unity Client not connecting to hostUnity 客户端未连接到主机
【发布时间】:2017-10-06 16:23:11
【问题描述】:

我正在尝试使用 unity 将网络客户端连接到主机,但通过调试检查 Debug.Log(myClient.isConnected.ToString()); 返回错误。我正在创建一个新客户端并使用setupClient() 方法连接,但我想我做错了什么。我怎样才能解决这个问题?我调试正确吗?

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");
    }
}

【问题讨论】:

    标签: c# unity3d networking


    【解决方案1】:

    我的调试是否正确?

    不,你没有正确使用NetworkClient.isConnected

    NetworkClient.Connect 函数是异步的,这意味着当您调用它时,它不会等待或阻止该连接实际连接。它使用线程进行连接,当您在调用NetworkClient.Connect 后立即使用NetworkClient.isConnected 时,您会得到意想不到的结果。

    NetworkClient 在连接时通过回调函数通知您。回调函数注册到NetworkClient.RegisterHandlerMsgType.Connect。在您的情况下,它已注册到 OnConnected 函数,因此当您连接到网络时应该调用 OnConnected

    您必须启动一个协程并在该协程函数中使用NetworkClient.isConnected 来等待连接,如下所示:

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

    或者使用回调函数(OnConnected)来检测客户端何时连接。


    不相关,但也订阅错误和断开连接事件将非常有用。在对网络代码进行故障排除时,这些非常重要。

    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);
    }
    

    【讨论】:

      猜你喜欢
      • 2014-11-29
      • 1970-01-01
      • 2017-10-05
      • 2014-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-30
      • 1970-01-01
      相关资源
      最近更新 更多