Avatar billede fiskerendk Nybegynder
22. oktober 2013 - 22:08 Der er 3 kommentarer og
1 løsning

Hjælp til konverting fra TCPClient til DataWriter.

Hej,

Jeg har fået til opgave og konvertere et ældre program jeg har lavet til et Windows Store/WinRT/Win8 app. Og i den forbindelse har jeg lidt udfordringer da mit problem var lavet med TCPClient. Og denne klasse ikke eksistere i disse apps. Jeg er derfor nød til at skifte dem ud til DataWriter/Reader (SocketStream) og det er desværre ikke helt uden problemer.

Gammel Kode:
    Public Function SendReceive(ByVal SendCommand As String)
        Dim returnCode As String = Nothing

        Try
            Dim TcpClient As New TcpClient
            TcpClient.Connect(strIPAddress, strPort)
            Dim NetworkStream As NetworkStream = TcpClient.GetStream

            Dim outNumBytes As Byte() = Encoding.ASCII.GetBytes(SendCommand)

            NetworkStream.Write(outNumBytes, 0, outNumBytes.Length)

            Dim inBytes(TcpClient.ReceiveBufferSize) As Byte
            Dim inNumBytes = NetworkStream.Read(inBytes, 0, TcpClient.ReceiveBufferSize)

            returnCode = Encoding.ASCII.GetString(inBytes, 0, inNumBytes)

            TcpClient.Close()
            TcpClient = Nothing
            NetworkStream = Nothing
        Catch ex As Exception
            returnCode = "Error: " & ex.Message

            Return returnCode
            Exit Function
        End Try

        Return returnCode
    End Function
Avatar billede bvli Praktikant
22. oktober 2013 - 23:18 #1
Har du evt kigget på StreamSocket-klassen?
Avatar billede fiskerendk Nybegynder
23. oktober 2013 - 09:42 #2
Ja og jeg fik ikke lige smidt det ind som jeg har fået lavet.
Da jeg sad ved en tablet og ikke havde materielet som jeg var i gang med. men her er mit nuværende:

srvTimeout.CancelAfter(10000)
Await ClientSocket.ConnectAsync(srvHostName, srvPort).AsTask(srvTimeout.Token)

StreamWriter = New DataWriter(ClientSocket.OutputStream)
StreamReader = New DataReader(ClientSocket.InputStream)
StreamReader.InputStreamOptions = InputStreamOptions.Partial

StreamWriter.WriteString("CONNECT")
Await StreamWriter.StoreAsync()

Og problemet er at når jeg næste laver en sub til at lave

StreamWriter.WriteString(variabel)
Await StreamWriter.StoreAsync()

Så virker den kun nogen gange og andre gange laver den en fejl med "En oprettet forbindelse blev afbrudt af softwaren på værtscomputeren." andre gange dropper den helt socketen og skal resette den igen.

Jeg har også lavet den med FlushAsync uden held.
        Try
            If SendCommand IsNot Nothing Then
                status.Text = "Forsøger at sende data ..."

                StreamWriter.WriteString(SendCommand)
                Await StreamWriter.StoreAsync()
                Await StreamWriter.FlushAsync()

                status.Text = "Data afsendt (" & SendCommand & ")"
            End If
        Catch ex As Exception
            status.Text = "Fejl ved afsendelse af data: " & ex.Message

            ClientSocket.Dispose()
            srvConnected = False
        End Try
Avatar billede fiskerendk Nybegynder
23. oktober 2013 - 15:17 #3
Efter noget tids tænken og prøven frem kom jeg jo til at se at den gamle kode jo også åbner og lukker TCPClient Streamen ved hver Write/Read cyklus. Det har jeg efterlignet med StreamSocket også virker det også.

Men er der er en måde man kunne gøre det på så den ikke hele tiden skal connecte -> sende og modtage -> Disconnecte og forfra hver gang. men at man holder streamen åben så man blot skal sende og modtage sålænge der er forbindelse.

koden:
    Private Async Function SendReceive(SendCommand As String) As Task(Of String)
        Dim srvTimeout As New CancellationTokenSource()
        ClientSocket = New StreamSocket()
        Dim returnData As String = Nothing

        Try
            'status.Text = "Opretter forbindelse ..."

            srvTimeout.CancelAfter(5000)
            Await ClientSocket.ConnectAsync(srvHostName, srvPort, SocketProtectionLevel.PlainSocket).AsTask(srvTimeout.Token)

            'status.Text = "Tilsluttet til " & srvHost
        Catch ex As Exception
            Select Case ex.HResult
                Case -2146233029
                    returnData = "Forbindelse mislykkedes: Timeout"
                Case Else
                    returnData = "Forbindelse mislykkedes: " & ex.Message
            End Select

            ClientSocket.Dispose()
            ClientSocket = Nothing

            Return returnData
            Exit Function
        End Try

        Try
            If SendCommand IsNot Nothing Then
                'status.Text = "Forsøger at sende data ..."

                Dim StreamWriter As New DataWriter(ClientSocket.OutputStream)

                StreamWriter.WriteString(SendCommand)
                Await StreamWriter.StoreAsync()

                StreamWriter.DetachStream()
                StreamWriter.Dispose()

                'status.Text = "Data afsendt (" & SendCommand & ")"
            End If
        Catch ex As Exception
            returnData = "Fejl ved afsendelse af data: " & ex.Message

            ClientSocket.Dispose()
            ClientSocket = Nothing

            Return returnData
            Exit Function
        End Try

        Try
            'status.Text = "Forsøger at modtage data ..."

            Dim StreamReader As New DataReader(ClientSocket.InputStream)
            StreamReader.InputStreamOptions = InputStreamOptions.Partial

            Dim strReceivedBytes As String = Await StreamReader.LoadAsync(512)
            returnData = StreamReader.ReadString(strReceivedBytes)

            StreamReader.DetachStream()
            StreamReader.Dispose()

            'status.Text = "Data modtaget (" & strReceived & ")"
        Catch ex As Exception
            returnData = "Fejl ved modtagelse af data: " & ex.Message

            ClientSocket.Dispose()
            ClientSocket = Nothing

            Return returnData
            Exit Function
        End Try

        Return returnData
    End Function
Avatar billede fiskerendk Nybegynder
16. november 2013 - 13:51 #4
Jeg har fortsat med løsningen ovenfra.
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

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