Dateien werden zu langsam runtergeladen und brechen manchmal ab.

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Samus Aran.

    Dateien werden zu langsam runtergeladen und brechen manchmal ab.

    Hallo Zusammen,

    ich hoffe ich bin in der richtigen Sektion.

    Ich habe folgendes Problem und dazu auch gleich eine Frage:

    Ich bin dabei einen Patcher zu erstellen und habe dazu auch schon
    eine Downloadmethode gewählt samt MD5 Hash, doch mir fällt auf,
    das bei dieser Methode die Dateien erstens zu langsam runtergeladen
    werden und zweitens es manchmal zu abbrüchen kommt und er dann
    auch nicht mehr weiterlädt.

    Ich habe das Grundlegendste anhand eines Videotutorials abgetippt
    und habe von daher leider keine Ahnung wie der ganze Downloadprozess
    aufgebaut ist und bin auch Neuling in dem Bereich und verstehe
    den abgetippten Code leider nicht, da in dem Video nicht erklärt wurde
    was er da jetzt genau macht.

    Nun zu meiner Frage:

    Welche Methode eignet sich am besten zum runterladen von Dateien
    und kann ich meinen derzeitigen Code so umbauen das die
    vorhandenen Funktionen davon nicht beeinträchtigt werden?
    Wenn ja, wie kann ich das ganze umbauen?
    Wäre super wenn mir da jemand bisschen helfen könnte, am besten
    über Skype.

    Hier mein derzeitiger Sourcecode:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Security.Cryptography
    3. Public Class Form1
    4. ' @@@@@@@ Deklarationen @@@@@@@ '
    5. Dim PATCHURL As String = "http://188.138.127.141/client/metin2/" ' URL zum Clienten auf dem Patchserver mit "/" am Ende.
    6. Dim PATCHLIST As String = "http://188.138.127.141/client/patchlist.xml" ' URL zur patchlist.xml
    7. Public Const REGI = "http://188.138.127.141" ' Link zur register.php der Website
    8. Public Const STARTER = "ClientStarter.exe" ' .exe oder .bin mit der der Client startet.
    9. Public Const CONFI = "config.exe" ' .exe mit dem die config.exe aufgerufen wird.
    10. Dim AppPath As String = My.Computer.FileSystem.CurrentDirectory
    11. Dim WithEvents PatchDownloader As New System.Net.WebClient
    12. Dim WithEvents PatchListDownloader As New System.Net.WebClient
    13. Dim DLURLS As New List(Of String)
    14. Dim ANZAHLDLS As Integer = 0
    15. Dim Busy As Boolean = Nothing
    16. Dim zeit1 As Integer = System.Environment.TickCount
    17. ' @@@@@@@@@@@@@@@@@@@@@@@@@@@@@ '
    18. Public Sub Terminate()
    19. Process.GetCurrentProcess.Kill()
    20. End Sub
    21. Public Sub Start()
    22. If File.Exists(STARTER) Then
    23. Process.Start(STARTER)
    24. Terminate()
    25. End If
    26. End Sub
    27. Public Sub Config()
    28. If File.Exists(CONFI) Then
    29. Process.Start(CONFI)
    30. End If
    31. End Sub
    32. Public Function MD5FileHash(ByVal sFile As String) As String
    33. Dim MD5 As New MD5CryptoServiceProvider
    34. Dim Hash As Byte()
    35. Dim Result As String = ""
    36. Dim Tmp As String = ""
    37. Dim FN As New FileStream(sFile, FileMode.Open, FileAccess.Read, FileShare.Read, 8192)
    38. MD5.ComputeHash(FN)
    39. FN.Close()
    40. Hash = MD5.Hash
    41. For i As Integer = 0 To Hash.Length - 1
    42. Tmp = Hex(Hash(i))
    43. If Len(Tmp) = 1 Then Tmp = "0" & Tmp
    44. Result += Tmp
    45. Next
    46. Return Result
    47. End Function
    48. #Region "-> Serverstatus"
    49. Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
    50. If PB_GSM.Value < 99 Then
    51. Button1.Enabled = False
    52. End If
    53. PictureBox1.Load("http://188.138.127.141/client/images/bg.png")
    54. PictureBox2.Load("http://188.138.127.141/client/images/muster.png")
    55. If File.Exists("patchlist.xml") Then File.Delete("patchlist.xml")
    56. TextBox1.Text = "Starte Patchvorgang..."
    57. BG_List.RunWorkerAsync()
    58. ' MySQL Status
    59. Dim client As New System.Net.Sockets.TcpClient
    60. Try
    61. client.Connect("80.241.210.245", 3306)
    62. Label11.Text = "Online"
    63. Catch ex As Exception
    64. Label11.Text = "Offline"
    65. End Try
    66. ' Login Status
    67. Try
    68. client.Connect("80.241.210.245", 11002)
    69. Label10.Text = "Online"
    70. Catch ex As Exception
    71. Label10.Text = "Offline"
    72. End Try
    73. ' World Status
    74. Try
    75. client.Connect("80.241.210.245", 13000)
    76. Label12.Text = "Online"
    77. Catch ex As Exception
    78. Label12.Text = "Offline"
    79. End Try
    80. ' Channel1 Status
    81. Try
    82. client.Connect("80.241.210.245", 13000)
    83. Label13.Text = "Online"
    84. Catch ex As Exception
    85. Label13.Text = "Offline"
    86. End Try
    87. ' Channel2 Status
    88. Try
    89. client.Connect("80.241.210.245", 13001)
    90. Label14.Text = "Online"
    91. Catch ex As Exception
    92. Label14.Text = "Offline"
    93. End Try
    94. ' Channel3 Status
    95. Try
    96. client.Connect("80.241.210.245", 13002)
    97. Label15.Text = "Online"
    98. Catch ex As Exception
    99. Label15.Text = "Offline"
    100. End Try
    101. ' Channel4 Status
    102. Try
    103. client.Connect("80.241.210.245", 13003)
    104. Label16.Text = "Online"
    105. Catch ex As Exception
    106. Label16.Text = "Offline"
    107. End Try
    108. End Sub
    109. #End Region
    110. #Region "-> Patchlist runterladen und Ordner erstellen"
    111. Private Sub BG_List_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BG_List.DoWork
    112. PatchListDownloader.DownloadFileAsync(New Uri(PATCHLIST), AppPath & "\patchlist.xml")
    113. If Not My.Computer.FileSystem.DirectoryExists("hshield") Then
    114. MkDir("hshield")
    115. End If
    116. If Not My.Computer.FileSystem.DirectoryExists("lib") Then
    117. MkDir("lib")
    118. End If
    119. If Not My.Computer.FileSystem.DirectoryExists("BGM") Then
    120. MkDir("BGM")
    121. End If
    122. If Not My.Computer.FileSystem.DirectoryExists("mark") Then
    123. MkDir("mark")
    124. End If
    125. If Not My.Computer.FileSystem.DirectoryExists("miles") Then
    126. MkDir("miles")
    127. End If
    128. If Not My.Computer.FileSystem.DirectoryExists("pack") Then
    129. MkDir("pack")
    130. End If
    131. If Not My.Computer.FileSystem.DirectoryExists("upload") Then
    132. MkDir("upload")
    133. End If
    134. End Sub
    135. #End Region
    136. #Region "-> Funktion zum starten des Patchvorgangs"
    137. Private Sub PatchListDownloader_DownloadFileCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs) Handles PatchListDownloader.DownloadFileCompleted
    138. TextBox1.Text = "Patchlist heruntergeladen. Starte nun das Patchen."
    139. PB_AktuDatei.Value = 0
    140. PB_GSM.Value = 0
    141. BG_Patcher.RunWorkerAsync()
    142. End Sub
    143. #End Region
    144. #Region "-> Patchvorgang"
    145. Private Sub BG_Patcher_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BG_Patcher.DoWork
    146. If BG_Patcher.CancellationPending = True Then
    147. BG_Patcher.CancelAsync()
    148. End If
    149. Try
    150. Dim xDocument As New Xml.XmlDocument
    151. xDocument.Load(AppPath & "\patchlist.xml")
    152. TextBox1.Text = "Starte nun das Patchen"
    153. For Each node As Xml.XmlNode In xDocument.SelectNodes("Dateien/Datei")
    154. Dim DateiPfad As String = AppPath & "\" & node.Attributes("Dateiname").InnerText
    155. Dim Checksum As String = node.Attributes("Checksum").InnerText
    156. Dim Check As Boolean = Nothing
    157. TextBox1.Text = "Prüfe: " & node.Attributes("Dateiname").InnerText
    158. If File.Exists(DateiPfad) = False Then
    159. DLURLS.Add(PATCHURL & node.Attributes("Dateiname").InnerText.Replace("\", "/"))
    160. Else
    161. If Checksum = MD5FileHash(DateiPfad) Then
    162. Check = True
    163. Else
    164. DLURLS.Add(PATCHURL & node.Attributes("Dateiname").InnerText.Replace("\", "/"))
    165. Check = False
    166. End If
    167. End If
    168. Next
    169. ANZAHLDLS = DLURLS.Count
    170. PB_GSM.Maximum = ANZAHLDLS
    171. PB_GSM.Value = 0
    172. Catch ex As Exception
    173. End Try
    174. Do
    175. Try
    176. If PatchDownloader.IsBusy = True Then
    177. Busy = True
    178. Else
    179. For Each DownloadDatei In DLURLS
    180. If IsNothing(DownloadDatei) Then Exit Do
    181. Do
    182. If Busy = False Then
    183. TextBox1.Text = "Patche: " & IO.Path.GetFileName(DownloadDatei)
    184. Dim SpeicherOrt As String = My.Computer.FileSystem.CurrentDirectory & "\" & DownloadDatei.Replace(PATCHURL, "").Replace("/", "\")
    185. Dim Uri As New Uri(DownloadDatei)
    186. If File.Exists(SpeicherOrt) = True Then
    187. File.Delete(SpeicherOrt)
    188. End If
    189. PatchDownloader.DownloadFileAsync(Uri, SpeicherOrt)
    190. Busy = True
    191. Exit Do
    192. End If
    193. Loop
    194. Next
    195. File.Delete(AppPath & "\patchlist.xml")
    196. TextBox1.Text = "Client ist auf dem neusten Stand. "
    197. Button1.Enabled = True
    198. Exit Do
    199. End If
    200. Catch ex As Exception
    201. End Try
    202. Loop
    203. End Sub
    204. #End Region
    205. Private Sub PatchDownloader_DownloadFileCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs) Handles PatchDownloader.DownloadFileCompleted
    206. Busy = False
    207. If PB_GSM.Value = ANZAHLDLS Then
    208. Else
    209. PB_GSM.Value += 1
    210. End If
    211. End Sub
    212. Private Sub PatchDownloader_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles PatchDownloader.DownloadProgressChanged
    213. PB_AktuDatei.Maximum = e.TotalBytesToReceive
    214. PB_AktuDatei.Value = e.BytesReceived
    215. End Sub
    216. #Region "-> Spiel starten-Button"
    217. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    218. If PB_GSM.Value = 100 Then
    219. Button1.Enabled = True
    220. End If
    221. Start()
    222. End Sub
    223. #End Region
    224. #Region "-> Einstellungen-Button"
    225. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    226. Config()
    227. End Sub
    228. #End Region
    229. #Region "-> Beenden-Button"
    230. Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    231. Terminate()
    232. End Sub
    233. #End Region
    234. #Region "-> x-Button"
    235. Private Sub x_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles x.Click
    236. Terminate()
    237. End Sub
    238. #End Region
    239. End Class

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Kryter“ ()

    Also für sowas:

    VB.NET-Quellcode

    1. Try
    2. '...
    3. '...
    4. Catch ex As Exception
    5. End Try
    gehört man gleich mal eingesperrt. gugge TryCatch ist ein heißes Eisen

    Ansonsten sind 270 Zeilen Code durchzugucken einfach zu viel.
    Mir sind blos recht viele Wiederholungen desselben Codes aufgefallen (Connect-Versuche mit nur unterschiedlichem Port), und was du da mit dem Busy, IsBusy, CancelationPending und CancelAsync treibst - wie gesagt: 27ß Zeilen sind zuviel.
    Geschrieben hab ich das ganze nicht, hab den Code aus einem
    Video abgeschrieben und da ich noch blutiger Anfänger bin,
    hab ich auch keinerlei Erfahrung mit optimieren eines Codes
    etc. pp...

    Ich lese mich aber auf jeden Fall mal durch deinen Thread.
    Lernen kann man immer etwas :)
    dieses Buch Lesen

    und merken: Youtoub-"Tutorials" sind von Dilletanten für solche, die es werden möchten.

    Allein dass du am Computer sitzst, und einen Text Buchstabe für Buchstabe vom Bildschirm abtippen mußt, in genau den Computer hinein, dessen Bildschirm du da angugge tust - also das sollte einem Programmierer zu denken geben, so eine depperte User-Beschäftigungs-Therapie.

    Ich mein, wer sein "Wissen" nicht ergonomischer unters Volk zu streuen weiß - bei dem kanns doch auch nicht viel sein, odr?
    Einen Großteil des Sourcecodes von oben habe ich selbst geschrieben, also
    ist jetzt nicht so das ich alles über YT-Videos oder sowas beziehe.
    Ich möchte es schließlich lernen und nicht einfach i-wo abtippen.

    Da das ganze auch mein Berufswunsch ist (Developer) versuche
    ich vorab schon bisschen was zu lernen...
    Das Grundgerüst, okay, ist aus dem YT-Video, aber viele Funktionen
    habe ich selbst geschrieben um so zu lernen, auch wenn ich
    paar Tutorials wie von Galileo Computing studiere um daraus zu lernen,
    aber ich versuche das ganze nachzuvollziehen um das ganze dann auch
    später allein hinzubekommen und das gelingt mir soweit auch ziemlich gut.

    Ich lerne auch sehr schnell dazu und mein Verständnis für solche Sachen
    ist auch recht gut, von daher hab ich innerhalb der letzten paar Wochen
    schon sehr viel lernen können und kann das auch gut umsetzen.
    Also ich programmiere jetzt schon ein Weilchen und ich muss dazu sagen, das ich bei einem richtig gut funktionierenden Patcher auch manchmal nicht weiterkam und das lag an meinen fehlenden Kenntnissen der Netzwerkprogrammierung und Grundlagen. Kurz gsagt: Ich hab mir den harten Weg ausgesucht und lernte über YouTube (Was, wie ErfinderdesRades schon sagte, nicht gut ist) statt über Bücher. Im Forum hier kann man definitiv auch lernen allerdings durchsuchst du auch Code von anderen und der könnre unoptimiert etc. sein. Momentan lese ich das zweite Buch über VB und ich muss sagen das ich in den letzten 3 Wochen mehr (sinnvolles) gelernt habe wie auf YouTube.

    Fazit: wenn du wiklich Developer werd willst kauf dir sofort ein Buch und beweerb dich früh bei Firmen was Ausbildung und Praktikas angeht denn die sind echt verdammt schnell weg.

    Auch bin ich der Meinung das du den Patcher erstmal im Hinterkopf bewahrst und einfachere Dinge programmierst. Patcher sind (für manche hier sehr einfach aber es kommt auch drauf an welche Features du einbauen möchtest) aber meiner Meinung nach für dich noch zwei Stockwerke zu hoch. Am besten fängst du direkt an VB durch ein Buch zu lernen und in ein paar Wochen solltest du in der Lage sein die Latchlist herunterzuladen und im programm zu verarbeiten mit Md5 File Hashs und allem was du brauchst.

    Viel Glück
    Japps, ich werd den Weg auch einschlagen, den Patcher werde ich dennoch weiter
    coden, denn ich stecke schon mittendrin und notfalls hol ich mir ein wenig Hilfe,
    da ich nämlich paar Leute kenne, die das ganze auch gelernt haben, das ist auch
    nochmal eine Erfahrung die, denke ich, sehr gut ist zum lernen.

    Ein Buch hab ich mir gestern bestellt, müsste jetzt demnächst auch ankommen,
    jedoch zum Thema Ausbildung und Praktikas, dass ist bei mir im mom leider
    noch nicht möglich, da ich die mittlere Reife benötige und da bin ich derzeit
    noch dran, sprich, hole ich derzeit in einer Abendschule nach.

    Aber dennoch Danke für die hilfreichen Tipps.
    Japp das werd ich mir dazu auch noch durchlesen und davon lernen...
    Naja ich guck mir einfach mal alles an was ich so finde an Lehrmittel ^^
    Das Buch was ich mir bestellt habe, sieht auch sehr lehrreich aus,
    hat knapp 1.000 Seiten, ich denke das ist auch noch ziemlich gut.

    Gut, hat aber auch alles jetzt nicht mehr mit dem Thema zu tun :D
    Ich werd mir alles anschauen und durchlesen und mal gucken,
    wird mir bestimmt einiges bringen. :)

    ErfinderDesRades schrieb:

    gehört man gleich mal eingesperrt. gugge TryCatch ist ein heißes Eisen

    Hör bloß auf damit. Das hatten wir schon. Du gehörst dafür eigentlich eingesperrt. Man braucht immer TryCatch, weil sonst kommt später dieser berühmte " ... hat ein Problem festgestellt und muss beendet werden" Fehler, den wir alle so mögen. Man kann nicht alle Eventualitäten vorab regeln.
    @Bluespide: ... aber es braucht garantiert kein Mensch während des Debuggings. Wenn du dir die Freundlichkeit (Zeilenangabe des Fehlers, Werte der Variablen zum Zeitpunkt der Exception etc.) der IDE während des Debuggings vermasselst, ist das dein Problem, aber versuch nicht, diesen Schrott auch noch anderen (garantiert unerfahreneren Usern als EDR) beizubringen.

    BjöNi schrieb:

    @Bluespide: ... aber es braucht garantiert kein Mensch während des Debuggings. Wenn du dir die Freundlichkeit (Zeilenangabe des Fehlers, Werte der Variablen zum Zeitpunkt der Exception etc.) der IDE während des Debuggings vermasselst, ist das dein Problem, aber versuch nicht, diesen Schrott auch noch anderen (garantiert unerfahreneren Usern als EDR) beizubringen.

    @BjöNi: Hast du dir überhaupt mal seinen Code angeguckt? Er hat das TryCatch um ein Client.connect gepackt und darauf habe ich das >immer< bezogen, weil es anders nicht geht. Wenn du das nicht checkst ist das nicht mein Problem.
    Dann sag halt, wodrauf du das immer beziehst! Immer heißt für mich immer, und da ist es definitiv falsch.
    Wir sind hier nicht im Disskussionsthread sondern im Thread eines noch unerfahrenen VB-Benutzers der von uns Hilfe erwartet, und ihr fangt jetzt an darüber zu disskutieren ob Try-Catch nötig ist oder nicht o.s.w.. Geht ins Disskusionsforum und postet da euren Dreck hin! Unglaublich sowas! :cursing: