2017-10-06 102 views
0

我想通過調試檢查Debug.Log(myClient.isConnected.ToString());返回錯誤返回到網絡客戶端使用統一的主機。我正在創建一個新客戶端並使用方法setupClient()進行連接,但我想我做的不正確。我怎樣才能解決這個問題?我正確調試這個嗎?Unity客戶端沒有連接到主機

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

回答

1

我能正確調試嗎?

不,你沒有正確使用NetworkClient.isConnected

函數是異步的,這意味着當您調用它時,它不會等待或阻止該連接實際連接。它使用一個線程來完成連接,當你在調用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); 
} 
相關問題