/// <summary> /// Builds MD5HashesResponse messages. /// </summary> /// <returns>Byte arrays that represents MD5HashesResponse messages.</returns> public static List<byte[]> BuildMD5HashesResponseMessages() { ReadOnlyCollection<string> files = RevisionsCache.files; string revisionDir = Application.persistentDataPath + "/Revisions/" + RevisionChecker.revision.ToString(); List<byte[]> res = new List<byte[]>(); MemoryStream stream = new MemoryStream(); BinaryWriter writer = new BinaryWriter(stream, Encoding.UTF8); NetUtils.WriteMessageHeader(writer, MessageType.MD5HashesResponse); writer.Write(false); // To be continued? for (int i = 0; i < files.Count; ++i) { string file = files[i]; if (stream.Length > CommonConstants.PACKET_SIZE - CommonConstants.PACKET_SAFE_LIMIT) { res.Add(stream.ToArray()); stream = new MemoryStream(); writer = new BinaryWriter(stream, Encoding.UTF8); NetUtils.WriteMessageHeader(writer, MessageType.MD5HashesResponse); writer.Write(false); // To be continued? } writer.Write(file); // Name of file if (Directory.Exists(revisionDir + "/" + file)) { writer.Write(true); // Is it a folder } else { writer.Write(false); // Is it a folder if (!File.Exists(revisionDir + "/" + file)) { DebugEx.FatalFormat("File {0} not found", revisionDir + "/" + file); return null; } if (!File.Exists(revisionDir + "/" + file + ".md5")) { RevisionChecker.CalculateMD5ForFile(revisionDir + "/" + file); } writer.Write(File.ReadAllText(revisionDir + "/" + file + ".md5", Encoding.UTF8)); // MD5 Hash of file } } res.Add(stream.ToArray()); for (int i = 0; i < res.Count - 1; ++i) { stream = new MemoryStream(res[i]); writer = new BinaryWriter(stream, Encoding.UTF8); NetUtils.WriteMessageHeader(writer, MessageType.MD5HashesResponse); writer.Write(true); // To be continued? } return res; }
/// <summary> /// Update is called once per frame. /// </summary> void Update() { DebugEx.VeryVeryVerbose("ServerScript.Update()"); RevisionChecker.Update(); int hostId; int connectionId; int channelId; int dataSize; byte error; NetworkEventType eventType = NetworkTransport.Receive(out hostId, out connectionId, out channelId, mBuffer, CommonConstants.PACKET_SIZE, out dataSize, out error); switch (eventType) { case NetworkEventType.Nothing: { // Nothing } break; case NetworkEventType.ConnectEvent: { DebugEx.DebugFormat("Client {0} connected", connectionId); if (connectionId == mClients.Count + 1) { mClients.Add(new ClientContext(connectionId)); } else { if (connectionId > 0 && connectionId <= mClients.Count && mClients[connectionId - 1] == null) { mClients[connectionId - 1] = new ClientContext(connectionId); } else { DebugEx.FatalFormat("Incorrect behaviour on handling connected client. connectionId = {0} mClients.Count = {1}", connectionId, mClients.Count); Server.DisconnectClient(connectionId); } } } break; case NetworkEventType.DataEvent: { if (connectionId > 0 && connectionId <= mClients.Count && mClients[connectionId - 1] != null) { mClients[connectionId - 1].OnMessageReceivedFromClient(mBuffer, dataSize); } else { DebugEx.FatalFormat("Incorrect behaviour on handling data from client. connectionId = {0} mClients.Count = {1}", connectionId, mClients.Count); Server.DisconnectClient(connectionId); } } break; case NetworkEventType.DisconnectEvent: { DebugEx.DebugFormat("Client {0} disconnected, error: {1}({2})", connectionId, (NetworkError)error, error); if (connectionId > 0 && connectionId <= mClients.Count && mClients[connectionId - 1] != null) { mClients[connectionId - 1] = null; } else { DebugEx.FatalFormat("Incorrect behaviour on handling disconnected client. connectionId = {0} mClients.Count = {1}", connectionId, mClients.Count); } } break; case NetworkEventType.BroadcastEvent: { DebugEx.ErrorFormat("Unexpected event type: {0}", eventType); } break; default: { DebugEx.ErrorFormat("Unknown event type: {0}", eventType); } break; } }