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
}
Pouvez-vous fournir également les classes AnimalDataMsgType et AnimalData? Alors, que je peux essayer de comprendre? – ZayedUpal
@ZayedUpal Je viens d'ajouter ces classes à la fin de la publication – greyBow
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. –