2017-10-06 64 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); 
} 
相关问题