TCP Verbindungen Managen

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Quadsoft.de.vu.

    TCP Verbindungen Managen

    Moin,

    ich programmiere gerade etwas ähnliches wie das hier [Beta] SimpleFileShare (WebServer)

    Nun habe ich aber ein strukturelles Problem wie ich das FileSharing bewerkstelligen soll.
    Speziell sollen natürlich mehrere Zugriffe möglich sein. Also dachte ich ich muss aufjedenfall mit Threads arbeiten, aber wie berwerkstellige ich dies am besten?

    Ich habe einen BackgroundWorker in dem auf eine eingehende Verbindung gewartet wird und dann den Stream ausließt.
    Hiernach wird dann der Header und die Datei in den Stream geschrieben.

    Was passiert aber nun wenn innerhalb diesen Vorgangs ein weitere eingehende Verbindung eingeht? Wie soll ich das Codetechnisch Managen?

    VB.NET-Quellcode

    1. Private Sub bg_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) Handles bg.DoWork
    2. client = server.AcceptTcpClient() ' auf eingehende Verbindung warten
    3. stream = client.GetStream()
    4. sr = New StreamReader(stream)
    5. While True
    6. If bg.CancellationPending Then Exit While
    7. Dim text As String = sr.ReadLine()
    8. If Not text = Nothing AndAlso text.Substring(0, 3) = "GET" Then
    9. Dim Id As String = text.Substring(5, text.Length - 14)
    10. th = New Threading.Thread(AddressOf SendFile)
    11. th.Start(Id)
    12. End If
    13. End While
    14. sr.Close()
    15. End Sub


    Irgendwie muss ich ja nachdem eine Verbindung eingegangen ist einen neuen Client erstellen wo auch wieder auf eine Verbindung gewartet wird. Wüsste nur nicht wie ich das machen sollte.
    Hi.

    Jede Verbindung bekommt ihren eigenen Thread. Das geht ganz transparent mit BeginAcceptTcpClient() - dir Rückrufmethode läuft in einem eigenen Thread und IAsyncResult.EndAcceptTcpClient() liefert dir den Client. Denke einfach, dass nur ein Client verbindet. Dass die Methode dann mehrfach parallel für jede Verbindung ausgeführt wird, ist zunächst nicht wichtig.
    Gruß
    hal2000
    Warum arbeitest du nicht mit BeginAccept? Das Callback erfolgt doch dann mW eh in nem neuen Thread.
    Im Zweifel muss du halt in einem BGW Thread auf Verbindung warten und sobald eine reinkommt, acceptest du und übergibts den Socket an nen neuen Thread. Im alten machst du dann wieder einen neuen Listener auf

    Dodo schrieb:

    Speziell sollen natürlich mehrere Zugriffe möglich sein.

    Hier auf folgendes achten: (Habe ich auch bei [Release] µServe 0.1 - Webserver mit Passwortschutz beachten müssen)

    Wenn du willst, dass eine Datei auch parallel heruntergeladen werden kann, dann musst du SyncLock Me verwenden . Dies sperrt die aktuelle Instanz für den aktuellen Thread. Das bewirkt, dass es nicht zu einem Konflikt mit anderen Threads kommt, die eventuell auch auf diese Datei oder andere Ressourcen zugreifen wollen. Hier dabei achten, dass die Datei in Blöcken gelesen und gesendet wird. Ich persönlich verwende bei µServe 4096-Byte Blöcke. (Um Dateien partiell auszulesen muss man FileStream.Seek() verwenden.) Diese Vorgehensweise gewährleistet, dass mehrere Dateien parallel heruntergeladen werden können.
    Also bei mir kommt es zu keinen Konflikten wenn ich eine Datei mehrfach herunterlade. Weil die Datei zubeginn des Thread gleich komplett eingelesen wird File.ReadAllByte(), hatte auch erst überlegt in Blöcken und mit Progressbar, aber das war mir zu blöde, so habe ich vollspeed weil die Datei direkt in Stream eingelesen.