get file in other computer?

Hostium

Member
Joined
Jan 23, 2009
Messages
21
Programming Experience
Beginner
Hello ,

I have an application that collects information and stores it into a HTML file. My goal is to use any web browser and type in my IP & port to access that HTML file from work.

I think I can get a TcpListener working in my application, I just don't know how to make it listen for a Http request, and when it gets the request which file to send ... does that make sense?
 
Last edited by a moderator:
I can see how the value is passed to the DoWork method. This is what I have ..

VB.NET:
        Public Sub ProcessThread()
            Dim clientSocket As System.Net.Sockets.Socket
            Dim socketThread As New Thread(AddressOf ProcessRequest)
            socketThread.Start(clientSocket)
            While (True)
                Try
                    clientSocket = tcpListener.AcceptSocket()
                    ' Socket Information
                    Dim clientInfo As IPEndPoint = CType(clientSocket.RemoteEndPoint, IPEndPoint)

                    Console.WriteLine("Client: " + clientInfo.Address.ToString() + ":" + clientInfo.Port.ToString())

                    ' Set Thread for each Web Browser Connection
                    Dim clientThread As New Thread(New ParameterizedThreadStart(AddressOf ProcessRequest))

                    clientThread.Start()

                Catch ex As Exception
                    Console.WriteLine(ex.StackTrace.ToString())

                    If clientSocket.Connected Then
                        clientSocket.Close()
                    End If

                End Try
            End While
        End Sub
        Public Sub ProcessRequest(ByVal clientSocket As System.Net.Sockets.Socket)
            Dim recvBytes(1024) As Byte
            Dim htmlReq As String = Nothing
            Dim bytes As Int32

            Try
                ' Receive HTTP Request from Web Browser
                bytes = clientSocket.Receive(recvBytes, 0, clientSocket.Available, SocketFlags.None)
                htmlReq = Encoding.ASCII.GetString(recvBytes, 0, bytes)

                Console.WriteLine("HTTP Request: ")
                Console.WriteLine(htmlReq)

                ' Set WWW Root Path
                Dim rootPath As String = Directory.GetCurrentDirectory() & "\Monitor\"

                ' Set default page
                Dim defaultPage As String = "hostium\hostium.html"

                Dim strArray() As String
                Dim strRequest As String

                strArray = htmlReq.Trim.Split(" ")

                ' Determine the HTTP method (GET only)
                If strArray(0).Trim().ToUpper.Equals("GET") Then
                    strRequest = strArray(1).Trim

                    If (strRequest.StartsWith("/")) Then
                        strRequest = strRequest.Substring(1)
                    End If

                    If (strRequest.EndsWith("/") Or strRequest.Equals("")) Then
                        strRequest = strRequest & defaultPage
                    End If

                    strRequest = rootPath & strRequest

                    sendHTMLResponse(strRequest, clientSocket)

                Else ' Not HTTP GET method
                    strRequest = rootPath & "Error\" & "400.html"

                    sendHTMLResponse(strRequest, clientSocket)
                End If

            Catch ex As Exception
                Console.WriteLine(ex.StackTrace.ToString())

                If clientSocket.Connected Then
                    clientSocket.Close()
                End If
            End Try
        End Sub

        ' Send HTTP Response
        Private Sub sendHTMLResponse(ByVal httpRequest As String, ByVal clientsocket As System.Net.Sockets.Socket)
            Try
                Dim info As New IO.FileInfo(httpRequest)
                ' Set HTML Header
                Dim htmlHeader As String = _
                    "HTTP/1.0 200 OK" & ControlChars.CrLf & _
                    "Server: WebServer 1.0" & ControlChars.CrLf & _
                    "Content-Length: " & info.Length & _
                    "Content-Type: " & getContentType(httpRequest) & _
                    ControlChars.CrLf & ControlChars.CrLf

                ' The content Length of HTML Header
                Dim headerByte() As Byte = Encoding.ASCII.GetBytes(htmlHeader)

                Console.WriteLine("HTML Header: " & ControlChars.CrLf & htmlHeader)

                ' Send HTML Header back to Web Browser
                clientsocket.Send(headerByte, 0, headerByte.Length, SocketFlags.None)

                ' Send HTML Content back to Web Browser
                Dim stream As IO.FileStream = info.OpenRead
                Dim buffer(10000) As Byte
                Dim read As Integer = -1
                Do Until read = 0
                    read = stream.Read(buffer, 0, buffer.Length)
                    clientsocket.Send(buffer, 0, read, SocketFlags.None)
                Loop
                stream.Close()

                ' Close HTTP Socket connection
                clientsocket.Shutdown(SocketShutdown.Both)
                clientsocket.Close()

            Catch ex As Exception
                Console.WriteLine(ex.StackTrace.ToString())

                If clientsocket.Connected Then
                    clientsocket.Close()
                End If
            End Try
        End Sub

        ' Get Content Type
        Private Function getContentType(ByVal httpRequest As String) As String
            If (httpRequest.EndsWith("html")) Then
                Return "text/html"
            ElseIf (httpRequest.EndsWith("htm")) Then
                Return "text/html"
            ElseIf (httpRequest.EndsWith("txt")) Then
                Return "text/plain"
            ElseIf (httpRequest.EndsWith("gif")) Then
                Return "image/gif"
            ElseIf (httpRequest.EndsWith("jpg")) Then
                Return "image/jpeg"
            ElseIf (httpRequest.EndsWith("jpeg")) Then
                Return "image/jpeg"
            ElseIf (httpRequest.EndsWith("pdf")) Then
                Return "application/pdf"
            ElseIf (httpRequest.EndsWith("pdf")) Then
                Return "application/pdf"
            ElseIf (httpRequest.EndsWith("doc")) Then
                Return "application/msword"
            ElseIf (httpRequest.EndsWith("xls")) Then
                Return "application/vnd.ms-excel"
            ElseIf (httpRequest.EndsWith("ppt")) Then
                Return "application/vnd.ms-powerpoint"
            Else
                Return "text/plain"
            End If
        End Function
    End Class

It's not coming up with any errors, it's showing me a warning ..

Warning 2 Variable 'clientSocket' is used before it has been assigned a value. A null reference exception could result at runtime. C:\Projects\ExLOTRO\ExLOTRO\Form1.vb 946 32 ExLOTRO

I moved the declaration of the clientSocket variable from class to the ProcessThread() method & followed the code example to pass the parameter to the processrequest method, I don't know what i've done wrong (Or haven't done yet).
 
VB.NET:
         Dim clientSocket As System.Net.Sockets.Socket
            Dim socketThread As New Thread(AddressOf ProcessRequest)
            socketThread.Start(clientSocket)

The clientThread is another thread that was already there, is that the thread I should be passing the clientsocket on? ...
 
VB.NET:
       Public Sub ProcessThread()
            Dim clientSocket As System.Net.Sockets.Socket
            While (True)
                Try
                    clientSocket = tcpListener.AcceptSocket()
                    ' Socket Information
                    Dim clientInfo As IPEndPoint = CType(clientSocket.RemoteEndPoint, IPEndPoint)

                    Console.WriteLine("Client: " + clientInfo.Address.ToString() + ":" + clientInfo.Port.ToString())

                    ' Set Thread for each Web Browser Connection
                    Dim clientThread As New Thread(New ParameterizedThreadStart(AddressOf ProcessRequest))
                    clientThread.Start(clientSocket)

                Catch ex As Exception
                    Console.WriteLine(ex.StackTrace.ToString())

                    If clientSocket.Connected Then
                        clientSocket.Close()
                    End If

                End Try
            End While
        End Sub

So I pass the socket on the clientThread. I'm still getting the same warning, although the server does run and the page comes up on my browser, when I refresh i'm still getting some connection issues once in a while.
 
Last edited:
The warning is just a warning, it warns you about possible problems with the code if certains conditions are met, you can fix by assigning a value to clientSocket variable when declaring it, that value is a null-reference of course (Nothing). To make code later in method safe (which it also wan't before), check that clientSocket is not Nothing before attempting to access the instance property Connected.
when I refresh i'm still getting some connection issues once in a while.
Well, at least now the server code is fixed as far as maintaining a socket reference for each request.
 
Back
Top