Avatar billede angelenglen Nybegynder
09. november 2011 - 15:49 Der er 3 kommentarer og
1 løsning

VB.net threading og webserver - hvad gør jeg forkert?

Jeg forsøger at oprette en webserver i VB.net, der lytter efter POST's og svarer tilbage når en POST er modtaget.

Når henholdsvis webserver-objektet starter, stopper eller modtager en POST, har jeg forsøgt mig at få den til at skrive i et tekst-felt via et event.

Foreløbig er det ikke lykkedes mig :-(

Jeg har tre kontroller i min form (frmMain) ved navn txtConsole og btnExit, btnClearConsole.
txtConsole er en multiline TextBox, og btnExit + btnClearConsole er en Button.

Foreløbig er det delt op i to filer, min form-fil frmMain.vb og en class-fil til min webserver: webserver.vb

---- frmMain.vb ----


Imports System.Threading
Public Class frmMain
    Private Sub btnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExit.Click
        Me.BeginInvoke(New MethodInvoker(AddressOf Me.Close)) 'afslut programmet
    End Sub

    Dim WithEvents oWebServer As WebServer
    Dim tWebServer As Thread

    Sub WebServer_OutputLineToConsoleHandler(ByVal Text As String) Handles oWebServer.OutputLineToConsole
        txtConsole.AppendText(Text & vbCrLf)
    End Sub

    Private Sub RunWebServer()
        oWebServer = New WebServer()
    End Sub

    Private Sub frmMain_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        Try
            oWebServer.StopServer()
            tWebServer.Abort()
        Catch ex As Exception
            'do nothing...
        End Try
    End Sub

    Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        tWebServer = New Thread(AddressOf RunWebServer)
        tWebServer.Start()
    End Sub

    Private Sub btnClearConsole_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClearConsole.Click
        txtConsole.Text = ""
    End Sub
End Class


---- WebServer.vb ----
Imports System
Imports System.Collections.Specialized
Imports System.IO
Imports System.Net
Imports System.Threading

Public Class WebServer
    Private RunWebServer As Boolean = True
    Public Event OutputLineToConsole(ByVal Text As String)

    Public Sub New()
        Dim srv As New HttpListener()
        srv.Prefixes.Add("http://localhost:800/")
        srv.Start()
        RaiseEvent OutputLineToConsole("Server started.")

        Dim LoopCounter As Int64 = 0
        While Thread.VolatileRead(RunWebServer) = True
            LoopCounter = LoopCounter + 1
            Dim ctx As HttpListenerContext = srv.GetContext()
            Dim req As HttpListenerRequest = ctx.Request
            Dim resp As HttpListenerResponse = ctx.Response
            'Console.WriteLine(req.Url.AbsolutePath)
            For Each k As String In req.Headers.AllKeys
                RaiseEvent OutputLineToConsole(k & " = " & req.Headers(k))
            Next
            For Each k As String In req.QueryString.AllKeys
                RaiseEvent OutputLineToConsole(k & " = " & req.QueryString(k))
            Next
            Dim sw As New StreamWriter(resp.OutputStream)
            sw.WriteLine("POST modtaget")
            sw.Close()
            Application.DoEvents()
        End While
        RaiseEvent OutputLineToConsole("Server stopped.")
        srv.Stop()
        srv.Close()
    End Sub

    Public Sub StopServer()
        Thread.VolatileWrite(RunWebServer, False)
    End Sub
End Class


Nogen der kan fortælle mig hvordan jeg kommer videre - hvis jeg har grebet det forkert an, er jeg selvfølgelig åben for andre forslag :-)
Avatar billede angelenglen Nybegynder
09. november 2011 - 15:50 #1
I bund og grund behøver kommunikation for min skyld ikke foregå via Events, men det var den metode jeg lige kunne finde der burde virke.
Hvis der er en anden, bedre løsning, vil jeg gerne bruge det :-)
Avatar billede arne_v Ekspert
13. november 2011 - 00:04 #2
Det her virker hos mig:

Imports System.IO
Imports System.Net
Imports System.Threading

Public Partial Class MainForm
    Public Sub New()
        Me.InitializeComponent()
        Dim t As Thread = New Thread(AddressOf WebServer)
        t.Start()
    End Sub
    Private Sub UpdateTextBox(tb As TextBox, msg As String)
        If tb.InvokeRequired Then
            tb.Invoke(DirectCast(Sub() tb.Text = tb.Text + msg + vbCrLf, Action))
        Else
            tb.Text = tb.Text + vbCrLf + msg
        End If
    End Sub
    Public Sub WebServer()
        Dim srv As New HttpListener()
        srv.Prefixes.Add("http://localhost:8888/")
        srv.Start()
        While True
            Dim ctx As HttpListenerContext = srv.GetContext()
            Dim req As HttpListenerRequest = ctx.Request
            Dim resp As HttpListenerResponse = ctx.Response
            For Each k As String In req.Headers.AllKeys
                UpdateTextBox(textBox1, k & "=" &  req.Headers(k))
            Next
            Dim sr As New StreamReader(req.InputStream)
            Dim body As String = sr.ReadToEnd()
            sr.Close()
            UpdateTextBox(textBox2, body)
            Dim sw As New StreamWriter(resp.OutputStream)
            sw.WriteLine("Det virker")
            sw.Close()
        End While
        'srv.Stop();
        'srv.Close();
    End Sub
End Class
Avatar billede angelenglen Nybegynder
15. november 2011 - 15:53 #3
Det er rigtigt godt, du må gerne lægge et svar for points :-)
Avatar billede arne_v Ekspert
15. november 2011 - 15:58 #4
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester



IT-JOB