Tcp komunikace, kde chyba?   zodpovězená otázka

VB.NET

Ahoj, teprve s tímhle začínám tak jsem si na zkoušku udělal 2 programy - server, který vypíše všechno co přijde a klient co se připojí a odešle text. Server funguje jak má, jenom klient, když napíšu zprávu a enter tak se konzola vypne a server vypíše že se klient odpojil. Proč?

Kód je ze seriálu Kreslící tabule pro více uživatelů přes TCP/IP,

Imports System.Net.Sockets

Module Module1

    Dim tcp As New TcpClient
    Dim networkStream As NetworkStream
    Const BUFFER_SIZE As Integer = 512 ' velikost bufferu 
    Dim Buffer(BUFFER_SIZE) As Byte
    Dim text_buffer As String
    Dim hostname As String

    Sub Main()
        Try
            Console.WriteLine("hostname?")
            hostname = Console.ReadLine()
            tcp.BeginConnect(hostname, 33333, AddressOf Pripojit, Nothing)
            Console.ReadLine()
        Catch e As Exception
            Console.WriteLine(e.Message)
            Console.ReadLine()
        End Try
    End Sub

    Sub Pripojit(ByVal at As System.IAsyncResult)
        Try
            tcp.EndConnect(at)
            networkStream = tcp.GetStream()
            Console.WriteLine("Connected")
                PosliPrikaz(Console.ReadLine())

        Catch e As ObjectDisposedException
            Console.ReadLine()
        Catch
            Console.WriteLine("Failed")
            Console.ReadLine()
        End Try
    End Sub

    Sub PosliPrikaz(ByVal prikaz As String)
        Dim Connected As Boolean = False
        If Not tcp Is Nothing Then
            If Not tcp.Client Is Nothing Then
                Connected = tcp.Connected
            End If
        End If
        If Connected = False Then
            Console.WriteLine("Not connected")
            Console.ReadLine()
            Exit Sub
        End If

        Try
            Dim bfr(prikaz.Length - 1) As Byte
            bfr = System.Text.Encoding.ASCII.GetBytes(prikaz
            networkStream.Write(bfr, 0, bfr.Length)
            Console.WriteLine("Sent")
            PosliPrikaz(Console.ReadLine())
        Catch e As ObjectDisposedException
            ' proběhlo zrušení spojení 
            Console.WriteLine(e.Message)
            Console.ReadLine()
        Catch ex As Exception
            tcp.Close()
            Console.WriteLine(ex.Message)
            Console.ReadLine()
        End Try
    End Sub

End Module

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Osobně bych řekl, že je důvod velice jednoduchý, děláš to jakožto konzolovou aplikaci, první odeslání se Ti sice provede, ale jakmile dojde k odeslání dat, tak se ukončí všechny vlákna a konzole se uzavře. Buď to musíš přepsat do Windows Form, nebo vytvořit vlákno, které bude neustále vyčítat uživatelský vstup do konzole ...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ale vždyť po úspěšné připojení už se čeká na vstup PosliPrikaz(Console.ReadLine()), procedura odešle data zase čeká na vstup PosliPrikaz(Console.ReadLine()), a tak pořád dokud neukončím aplikaci, ne?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Díky, už to mám. To co jsem si chtěl vyzkoušet mám, tak dobrý.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Bezva, v PosliPrikaz pošlem príkaz, vypíšem Sent a zavolám PosliPrikaz.Nehodilo Vám to ešte StaclOverflowException ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Vzhledem k tomu, že před rekurzivním voláním je ještě Console.ReadLine, tak předpokládám, že než se zásobník zaplní, tak uživatel zemře vyčerpáním - napsat tolik řádků dá práci. Dřív mu dojde trpělivost a aplikaci ukončí.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback