2017-10-20 34 views
1

J'ai besoin d'aide pour cela. Je ne suis pas sûr comment résoudre l'erreur de discordance de CRC. Tout ce que je suis en train de faire est d'envoyer un tableau d'octets de mon client à mon serveur et que je reçois cette erreur:Erreur de déconnexion du client UNet: CRCMismatch sur NetworkClient.Connect

UNet Client Disconnect Error: CRCMismatch UnityEngine.Networking.NetworkIdentity:UNetStaticUpdate()

J'ai essayé pendant plus d'un mois pour relier les points et faire fonctionner le réseau pour fonctionner correctement, mais chaque pas en avant, conduit à cinq pas en arrière. J'ai essentiellement tourné dans les cercles, j'ai fait chaque tutoriel de mise en réseau de l'unité qui existe et je suis encore tellement perdu. J'ai vraiment besoin d'aide pour résoudre ça. Est-ce que quelqu'un pourrait m'aider avec ça? J'ai également joint le code complet ci-dessous. Merci d'avance!

côté client

public class Client : NetworkBehaviour { 

NetworkClient client = new NetworkClient(); 

private const int MAX_CONNECTION = 100; 

private string serverIP = "127.0.0.1"; 
private int port = 5708; 
private int hostId; 
private int webHostId; 
private int reliableChannel; 
private int reliableSeqChannel; 
private int reliableFragChannel; 
private int unreliableChannel; 
private int unreliableSeqChannel; 

private string playerName; 
private int connectionId; 
private float connectionTime; 
private bool isStarted = false; 
private bool isConnected = false; 
private bool readyToSendMsg = false; 
private byte error; 

private GameObject infoDisplayText; 

public Texture2D texToSend; 
string typeToSend = "Deer"; 
string idToSend = "1"; 
int strengthToSend = 80; 
int hitPointsToSend = 2; 

private string GetPlayerName() 
{ 
    switch (Network.player.ipAddress.ToString()) 
    { 
     case "192.168.1.160": 
      playerName = "SMO Server"; 
      break; 

     case "192.168.1.161": 
      playerName = "SMO Client 1"; 
      break; 

     case "192.168.1.162": 
      playerName = "SMO Client 2"; 
      break; 

     case "192.168.1.163": 
      playerName = "SMO Client 3"; 
      break; 

     case "192.168.1.164": 
      playerName = "SMO Client 4"; 
      break; 

     default: 
      playerName = "SMO UNREG"; 
      break; 
    } 
    return playerName; 
} 

private void Start() 
{ 
    infoDisplayText = GameObject.Find("InfoDisplay"); 

    client.RegisterHandler(AnimalDataMsgType.SYSTEM_CONNECT, OnConnected); 
    client.RegisterHandler(AnimalDataMsgType.SYSTEM_DISCONNECT, OnDisconnected); 
    client.RegisterHandler(AnimalDataMsgType.SYSTEM_ERROR, OnError); 

    client.Connect(serverIP, port); 
} 

public void Connect() 
{ 
    string pName = GetPlayerName(); 

    if (pName == "") 
     return; 

    playerName = pName; 

    NetworkTransport.Init(); 

    ConnectionConfig cc = new ConnectionConfig(); 

    reliableChannel = cc.AddChannel(QosType.Reliable); 
    reliableSeqChannel = cc.AddChannel(QosType.ReliableSequenced); 
    reliableFragChannel = cc.AddChannel(QosType.ReliableFragmented); 
    unreliableChannel = cc.AddChannel(QosType.Unreliable); 
    unreliableSeqChannel = cc.AddChannel(QosType.UnreliableSequenced); 
    cc.PacketSize = 1440; 
    cc.FragmentSize = 900; 
    cc.ResendTimeout = 1000; 
    cc.DisconnectTimeout = 5000; 
    cc.ConnectTimeout = 1000; 
    cc.MaxConnectionAttempt = 5; 

    HostTopology topo = new HostTopology(cc, MAX_CONNECTION); 

    hostId = NetworkTransport.AddHost(topo, 0); 

    // Run client/server on different machines 
    //hostID = NetworkTransport.AddHost(topo, port, null); 

    connectionId = NetworkTransport.Connect(hostId, serverIP, port, 0, out error); 

    infoDisplayText = GameObject.Find("InfoDisplay"); 
    infoDisplayText.GetComponent<Text>().text += playerName + " connected.\n"; 

    connectionTime = Time.time; 
    isConnected = true; 
} 

private void Update() 
{ 
    if (!isConnected) 
     return; 

    int recHostId, connectionId, channelId; 
    byte[] recBuffer = new byte[1024]; 
    int bufferSize = 1024; 
    int dataSize; 
    byte error; 

    NetworkEventType recData = NetworkTransport.Receive(out recHostId, out connectionId, out channelId, recBuffer, bufferSize, out dataSize, out error); 

    switch (recData) 
    { 
     case NetworkEventType.ConnectEvent: 
      Debug.Log("Player " + connectionId + " has connected"); 
      infoDisplayText.GetComponent<Text>().text += "Connected to Server.\n"; 
      break; 
    } 
} 

public void SendOnButtonPress() 
{ 
    if (readyToSendMsg == true) 
     SendTexture(texToSend, typeToSend, idToSend, strengthToSend, hitPointsToSend); 
} 

//Call to send the Texture and a simple string message 
public void SendTexture(Texture2D tex, string type, string id, int strength, int hitpoints) 
{ 
    AnimalData animalData = new AnimalData(); 

    animalData.Tex = tex.GetRawTextureData(); 
    animalData.Type = type; 
    animalData.Id = id; 
    animalData.Strength = strength; 
    animalData.Hitpoints = hitpoints; 

    client.Send(AnimalDataMsgType.animalData, animalData); 
} 

private void OnConnected(NetworkMessage netMsg) 
{ 
    readyToSendMsg = true; 
    Debug.Log("Connected to server"); 
} 

private void OnDisconnected(NetworkMessage netMsg) 
{ 
    readyToSendMsg = false; 
    Debug.Log("Disconnected from server"); 
} 

private void OnError(NetworkMessage netMsg) 
{ 
    //SystemErrorMessage errorMsg = reader.SmartRead<SystemErrorMessage>(); 
    // Debug.Log("Error connecting with code " + errorMsg.errorCode); 
    Debug.Log("Error connecting."); 
} 

côté serveur

public class Server : NetworkBehaviour 
{ 
    private const int MAX_CONNECTION = 100; 
    private int port = 5708; 
    private int hostId; 
    private int webHostId; 
    private int reliableChannel; 
    private int reliableSeqChannel; 
    private int reliableFragChannel; 
    private int unreliableChannel; 
    private int unreliableSeqChannel; 

    private bool isStarted = false; 
    private byte error; 

    private GameObject infoDisplayText; 

    private void Awake() 
    { 
     infoDisplayText = GameObject.Find("InfoDisplay"); 
    } 

    private void Start() 
    { 
     NetworkTransport.Init(); 

     ConnectionConfig cc = new ConnectionConfig(); 

     reliableChannel = cc.AddChannel(QosType.Reliable); 
     reliableSeqChannel = cc.AddChannel(QosType.ReliableSequenced); 
     reliableFragChannel = cc.AddChannel(QosType.ReliableFragmented); 
     unreliableChannel = cc.AddChannel(QosType.Unreliable); 
     unreliableSeqChannel = cc.AddChannel(QosType.UnreliableSequenced); 

     HostTopology topo = new HostTopology(cc, MAX_CONNECTION); 

     hostId = NetworkTransport.AddHost(topo, port, null); 

     if (NetworkTransport.IsStarted) 
     { 
      isStarted = true; 
      Debug.Log("NetworkTransport is Started."); 
      infoDisplayText.GetComponent<Text>().text += "NetworkTransport is Started.\n"; 
     } 

     Debug.Log("Server Started."); 
     infoDisplayText.GetComponent<Text>().text += "Server Started.\n"; 

     setupRegisterHandler(); 
    } 
    private void Update() 
    { 
     if (!isStarted) 
      return; 

     int recHostId, connectionId, channelId; 
     byte[] recBuffer = new byte[1024]; 
     int bufferSize = 1024; 
     int dataSize; 
     byte error; 

     NetworkEventType recData = NetworkTransport.Receive(out recHostId, out connectionId, out channelId, recBuffer, bufferSize, out dataSize, out error); 

     switch (recData) 
     { 
      case NetworkEventType.ConnectEvent: 
       Debug.Log("Player " + connectionId + " has connected"); 
       infoDisplayText.GetComponent<Text>().text += "Player " + connectionId + " has connected\n"; 
       break; 
     } 
    } 

    // Create a client and connect to the server port 
    public void setupRegisterHandler() 
    { 
     NetworkServer.Listen(port); 
     Debug.Log("Registering server callbacks"); 
     NetworkServer.RegisterHandler(AnimalDataMsgType.animalData, OnTextureReceive); 
    } 

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

     string type = animalData.Type; 
     Debug.Log("Type : " + type); 

     string id = animalData.Id; 
     Debug.Log("ID : " + id); 

     int strength = animalData.Strength; 
     Debug.Log("Strength : " + strength); 

     int hitpoints = animalData.Hitpoints; 
     Debug.Log("Hit Points : " + hitpoints); 

     //Your Received Texture2D 
     Texture2D receivedtexture = new Texture2D(1280, 1024); 
     receivedtexture.LoadRawTextureData(animalData.Tex); 
     receivedtexture.Apply(); 

     Debug.Log(type + " data received!"); 
     infoDisplayText.GetComponent<Text>().text += type + " data received!\n"; 
    } 
} 

classe AnimalDataMsgType

public class AnimalDataMsgType 
{ 
    public static short animalData = MsgType.Highest + 1; 
    public static short SYSTEM_CONNECT = MsgType.Connect; 
    public static short SYSTEM_DISCONNECT = MsgType.Disconnect; 
    public static short SYSTEM_ERROR = MsgType.Error; 
} 

AnimalData classe

public class AnimalData : MessageBase 
{ 
    public byte[] Tex;  // data coming from CanvasController 
    public string Type;  // data coming from CanvasController 
    public string Id;  // data coming from GameManager 
    public int Strength; // data coming from PlayerController 
    public int Hitpoints; // data coming from PlayerController 
    public bool IsAlive; // data coming from PlayerController 
} 
+0

Pouvez-vous fournir également les classes AnimalDataMsgType et AnimalData? Alors, que je peux essayer de comprendre? – ZayedUpal

+0

@ZayedUpal Je viens d'ajouter ces classes à la fin de la publication – greyBow

+0

Le HLAPI CRC est un hachage des scripts NetworkBehaviour connus et des canaux qu'ils utilisent (avec NetworkSettingsAttribute). Oui, il est prévu de se produire si deux projets Unity différents (et incompatibles), ou des versions du même projet, se parlent. Essayez de reconstruire votre application (ou les applications si le client et le serveur sont séparés). Cela peut causer si vous changez du code de réseau, et oubliez de reconstruire. –

Répondre

0

Je résolu mon problème en ajoutant client.Configure(cc, 1); juste avant client.Connect(serverIP, port);. Le problème était mon client NetworkClient connectionConfig profil doit être défini sur les mêmes paramètres de configuration définis dans mon NetworkTopology HostTopology et sans définir un connectionConfig à ma fonction client.Connect cela causait la discordance CRC. Aussi lors de l'envoi d'un message après la création de mon instance NetworkClient, j'utilise client.SendByChannel afin que je puisse définir mon channelId.