2017-10-06 1 views
0

ネットワーククライアントをユニティを使用してホストに接続しようとしていますが、デバッグチェックDebug.Log(myClient.isConnected.ToString());によってfalseが返されています。私は新しいクライアントを作成し、メソッド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"); 
    } 
} 

答えて

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); 
} 
関連する問題