Server a X clientu   zodpovězená otázka

VB.NET

Hezky vecer :]

Rad bych poprosil o pomoc vyresit komunikaci pres tcp kde se pripojuje X klientu k jednomu servru. Obdoba kreslici tabule v jednom z clanku ale pro vic lidi.

    Private Sub Server_Start(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        tcpListener = New Net.Sockets.TcpListener(System.Net.IPAddress.Any, 5678)
        Try
            tcpListener.Start(7)
        Catch ex As Exception
            Exit Sub
        End Try
        Sock = AddressOf SockConnect
        tcpListener.BeginAcceptTcpClient(AddressOf SockConnect, Me)
        MsgBox("start")
    End Sub

    Private Sub SockConnect(ByVal AR As IAsyncResult)
        tcp = tcpListener.EndAcceptTcpClient(AR)
        MsgBox("Client connected")
        ns = tcp.GetStream()
        ns.BeginRead(Buffer, 0, Buf_Size, AddressOf Read, Me)
        tcpListener.BeginAcceptTcpClient(Sock, tcpListener)
    End Sub

    Private Sub Read(ByVal at As System.IAsyncResult)
        Dim incoming As Integer = ns.EndRead(at)
        If incoming < 1 Then Throw New Exception()
        MsgBox(System.Text.Encoding.ASCII.GetString(Buffer, 0, incoming))
        tcp.GetStream.BeginRead(Buffer, 0, Buf_Size, AddressOf Read, Me)
    End Sub

V tomto kodu dojde ktomu, ze pri pripojeni a komunikaci druheho klinta, prerusi server komunikaci s prvnim :x Rad bych aby server mohl komunikovat s obema zaroven :x

Predem diky za vase odpovedi :)

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

Jeste sem zapomnel deklarace pro prehlednost (uplnost)

Private tcpListener As TcpListener
Dim tcp As New TcpClient
Private Sock As AsyncCallback
Const Buf_Size As Integer = 512
Dim Buffer(Buf_Size) As Byte
Dim ns As NetworkStream

diky :]

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

Váš kód jsem vyzkoušel a funguje, ovšem musíte si uvědomit, že procedury se při asynchronním zpracování volají v jiném vlákně, takže nemůžete používat sdílené prostředky (jako například buffer). Přehoďte tedy všechny deklarace kromě tcpListenera do procedur, ve kterých se používají. Jinak může dojít k tomu, že jedno vlákno do bufferu zapisuje a druhé z něj zároveň čte, což není úplně ideální.

Přerušení komunikace s prvním má patrně ten důvod, že si někde zrušíte proměnnou tcp a pak už se na klienta nedostanete.

Pro realizaci těchto věcí doporučuji nadeklarovat si List(Of TcpClient) a připojené klienty přidávat do seznamu. Při odpojení je nezapomínejte odebírat z toho seznamu, ať se vám tam nehromadí.

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

Dekuji za odpoved :] problem je vyresen :]

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

Pokud chcete používat více klientů, použijte .NET Remoting nebo WCF. Je to jednodušší a spolehlivější. Remotingový server totiž dokáže automaticky obsluhovat libovolný počet klientů.

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

Dekuji to mate pravdu :]

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

Ale prece jenom pokud by se nasel nekdo kdo by mne to vysvetlil i pomoci tridy system.net.socket.tcp tak bych mu byl moc vdecny :]

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