private void DownloadButton_Click(object sender, RoutedEventArgs e) { DownloadableFile file = (sender as Button).DataContext as DownloadableFile; Thread downloadThread = new Thread(() => Download(file)); downloadThread.Start(); }
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"); } }
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(); } }