示例#1
0
        public PatchmanagerServer()
        {
            masterFilesPath = Path.GetFullPath(Path.Combine(@"..\..\..\..\", "GameClientBuild"));

            FileChecker.GetFilesDictionaryProgress += ProgressUpdateReceived;
            Task.Run(() => FileChecker.GetFilesDictionary(out masterFiles, masterFilesPath));

            while (masterFiles == null)
            {
            }
            Console.WriteLine("FilesDictionary created");

            Thread t = new Thread(HandleConnections);

            t.IsBackground = true;
            t.Start();

            Console.WriteLine("Started listening for clients");
        }
示例#2
0
        //private static Task<bool> ConnectClient () {

        //}

        public static void StartPatchCheck(string dir)
        {
            Status = PatchStatus.Connecting;
            StatusChanged.Invoke(null, new EventArgs());
            downloadDirectory = dir;
            Directory.CreateDirectory(downloadDirectory);
            FileChecker.GetFilesDictionaryProgress += ProgressUpdateReceived;
            Task.Run(() => FileChecker.GetFilesDictionary(out allFilesDictionary, downloadDirectory));

            while (allFilesDictionary == null)
            {
            }
            while (client == null)
            {
                Thread.Sleep(TimeSpan.FromMilliseconds(16.66667));
                try {
                    client = new TcpClient(GlobalVariables.PATCHMANAGER_IP, GlobalVariables.PATCHMANAGER_PORT);
                }
                catch {
                }
            }



            SendFileDictionaryToServer();
            MissingFiles = null;
            Completed    = false;

            bool waitingForFile = false;

            Status = PatchStatus.Downloading;
            StatusChanged.Invoke(null, new EventArgs());

            while (!Completed)
            {
                if (MessageFormatter.Connected(client))
                {
                    if (MissingFiles == null)
                    {
                        while (client.GetStream().DataAvailable)
                        {
                            string jsonList = MessageFormatter.ReadStreamOnce(client.GetStream());
                            MissingFiles = JsonConvert.DeserializeObject <FileTransferModel>(jsonList);
                            MissingFilesUpdated.Invoke(null, new EventArgs());
                            if (MissingFiles.Files.Count == 0)
                            {
                                DownloadComplete.Invoke(null, new EventArgs());
                                Status = PatchStatus.Done;
                                StatusChanged.Invoke(null, new EventArgs());
                                Completed = true;
                            }
                        }
                    }
                    //Start requesting missing files from server
                    else if (MissingFiles.Files.Count > 0)
                    {
                        if (!waitingForFile)
                        {
                            byte [] fileRequestData = MessageFormatter.MessageBytes(MissingFiles.Files [0].FilePath);
                            client.GetStream().Write(fileRequestData, 0, fileRequestData.Length);
                            waitingForFile = true;
                        }
                        else
                        {
                            while (client.GetStream().DataAvailable)
                            {
                                MessageFormatter.ReadFile(client, MissingFiles.Files [0].FilePath, downloadDirectory);
                                MissingFiles.RemainingSize -= MissingFiles.Files [0].Size;
                                MissingFilesUpdated.Invoke(null, new EventArgs());
                                MissingFiles.Files.RemoveAt(0);
                                waitingForFile = false;
                            }
                        }
                        if (MissingFiles.Files.Count == 0)
                        {
                            waitingForFile = false;
                            DownloadComplete.Invoke(null, new EventArgs());
                            Status = PatchStatus.Done;
                            StatusChanged.Invoke(null, new EventArgs());
                            Completed = true;
                        }
                    }
                }
            }
            client.Dispose();
        }