示例#1
0
        private void DownloadButton_Click(object sender, RoutedEventArgs e)
        {
            DownloadableFile file           = (sender as Button).DataContext as DownloadableFile;
            Thread           downloadThread = new Thread(() => Download(file));

            downloadThread.Start();
        }
示例#2
0
        private void Download(DownloadableFile file)
        {
            try
            {
                TcpClient  client   = new TcpClient(IPBuilder.GetIP());
                IPEndPoint serverIP = IPBuilder.GetIP(file.IP, file.Port);

                client.Connect(serverIP);
                client.Client.ReceiveTimeout = 7000;
                client.Client.SendTimeout    = 7000;

                MyStreamIO myStream = new MyStreamIO(client.GetStream());

                myStream.Write("<isClient>");
                myStream.GetNEXT();

                myStream.Write(file.FileName);
                string rely = myStream.ReadString();

                if (rely != "<fileFound>")
                {
                    client.GetStream().Close();
                    client.Close();
                    return;
                }

                IPEndPoint udpClientIP = IPBuilder.GetIP();
                UdpClient  udpClient   = new UdpClient(udpClientIP);


                myStream.Write(udpClientIP.Address.ToString());
                string udpListenerIP = myStream.ReadString();

                myStream.Write(udpClientIP.Port);
                int udpListenerPort = myStream.ReadInt();

                client.GetStream().Close();
                client.Close();

                UdpDownload(udpClient, IPBuilder.GetIP(udpListenerIP, udpListenerPort), file);

                udpClient.Close();
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "Client error: when getting file info for download from file server");
            }
        }
示例#3
0
        private void UdpDownload(UdpClient udpClient, IPEndPoint udpListenerIP, DownloadableFile file)
        {
            byte[] hashBuffer;
            byte[] dataBuffer;
            byte[] messageBuffer;
            long   filesize = file.FileSize;
            long   received = 0;

            DownloadedFile newFileInfo = new DownloadedFile(file.FileName, "Downloading...");

            ListHolder.DownloadedFiles.Add(newFileInfo);
            ListHolder.UpdateList();

            udpClient.Client.ReceiveTimeout = 7000;
            udpClient.Client.SendTimeout    = 7000;
            try
            {
                byte[] relyBuffer = udpClient.Receive(ref udpListenerIP);

                messageBuffer = Encoding.UTF8.GetBytes("<ok>");
                udpClient.Send(messageBuffer, messageBuffer.Length, udpListenerIP);

                using (FileStream newFile = File.OpenWrite(file.ShortenFileName))
                {
                    while (received < filesize)
                    {
                        hashBuffer = udpClient.Receive(ref udpListenerIP);
                        dataBuffer = udpClient.Receive(ref udpListenerIP);

                        string hash = Encoding.UTF8.GetString(hashBuffer);
                        string data = Encoding.UTF8.GetString(dataBuffer);

                        if (MyMD5Hash.VerifyMd5Hash(dataBuffer, hash) == false)
                        {
                            messageBuffer = Encoding.UTF8.GetBytes("<error>");
                            udpClient.Send(messageBuffer, messageBuffer.Length, udpListenerIP);
                            continue;
                        }

                        messageBuffer = Encoding.UTF8.GetBytes("<ok>");
                        udpClient.Send(messageBuffer, messageBuffer.Length, udpListenerIP);

                        newFile.Write(dataBuffer, 0, dataBuffer.Length);
                        received += dataBuffer.Length;
                    }
                }

                udpClient.Close();
                newFileInfo.Status = "Finish";
                ListHolder.UpdateList();

                MyDispatcher.Dispatcher.Invoke(() =>
                {
                    MessageBox.Show("finish download file: " + file.FileName);
                });
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "Client error: when download file from file server");
                newFileInfo.Status = "Download error";
                ListHolder.UpdateList();
            }
        }