vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
TOP-Angebot: 17 bzw. 24 Entwickler-Vollversionen zum unschlagbaren Preis!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
TCP/IP Threadübergabe von Clienten ( INVOKE) ? 
Autor: S3Ri0US
Datum: 15.06.09 05:31

Guten Morgen zusammen ! Ich versuche mich gerade an den neuen TCP sachen. Das letzte mal als ich etwas für das Netzwerk geschrieben habe war WinSock noch Aktuell.. habe mich also die letzten 5 Stunden mit den neuen Socket funktionen auseinander gesetzt. Nun habe ich allerdings mal wieder ein Invoke-problem.
Ich möchte ein ganz einfaches senden und empfangen von Server zu Clienten machen. Ja Clienten. (mehrzahl)

z.b. Client schickt String : Hello... server schickt string: Welcome zurück.

Das ganze Funktionier auch schon ganz gut. Nur irgend wie muss ich jetzt aus meiner CLasse welche über einen neuen Thread gestartet wird auf die Windows.Forms zugreiffen können. habe es mit einem Method Invoker versucht. Allerdings friert die Anwendung ein sobald dieser aufgerufen wird.


    Sub StartTCP_list()
 
        Dim ipAddr As System.Net.IPAddress
        ipAddr = IPAddress.Parse(GetLocalIP)
 
        Dim serverSocket As New TcpListener(ipAddr, 8888)
        Dim clientSocket As TcpClient
        Dim infiniteCounter As Integer
 
        serverSocket.Start()
        status_text.Text = "TCP-Überwachung gestartet."
        infiniteCounter = 0
        For infiniteCounter = 1 To 2
            infiniteCounter = 1
            clientSocket = serverSocket.AcceptTcpClient()
 
            Dim client As New handleClinet
            client.startClient(clientSocket, clientsList)
        Next
 
        clientSocket.Close()
        serverSocket.Stop()
        status_text.Text = "TCP-Überwachung wurde beendet."
    End Sub
 
    Public Class handleClinet
        Dim clientSocket As TcpClient
        Dim clientsList As Hashtable
 
        Public Sub startClient(ByVal inClientSocket As TcpClient, ByVal cList _
          As Hashtable)
            Me.clientSocket = inClientSocket
            Me.clientsList = cList
            Dim ctThread As Threading.Thread = New Threading.Thread(AddressOf _
              doChat)
            ctThread.Start()
        End Sub
 
        Private Sub doChat()
            Dim infiniteCounter As Integer
            Dim bytesFrom(10024) As Byte
            Dim dataFromClient As String
            For infiniteCounter = 1 To 2
                infiniteCounter = 1
                Try
                    Dim networkStream As NetworkStream = clientSocket.GetStream( _
                      )
                    networkStream.Read(bytesFrom, 0, CInt( _
                    clientSocket.ReceiveBufferSize))
                    dataFromClient = System.Text.Encoding.ASCII.GetString( _
                    bytesFrom)
 
                    Dim broadcastStream As NetworkStream = _
                      clientSocket.GetStream()
                    Dim broadcastBytes As [Byte]()
 
                    broadcastBytes = Encoding.ASCII.GetBytes("test")
 
                    broadcastStream.Write(broadcastBytes, 0, _
                      broadcastBytes.Length)
                    broadcastStream.Flush()
                Catch ex As Exception
                    clientSocket.Close()
                    MsgBox(ex.ToString)
                End Try
            Next
        End Sub
    End Class
hoffe es fällt euch was ein. Habe es auch schon mit Globalen Variablen versucht. Da es sich aber um mehrere Clienten handelt, war auch dies eine Sackgasse.

Danke für eure Hilfe.

Beitrag wurde zuletzt am 15.06.09 um 05:31:36 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: TCP/IP Threadübergabe von Clienten ( INVOKE) ? 
Autor: ModeratorRalf Ehlert (Moderator)
Datum: 15.06.09 08:11

Du musst die Invoke()-Methode des jeweiligen Steuerelementes aufrufen, um es manipulieren zu können. Zu dieser Methode gibt es im Forum genug Beiträge.

Ralf

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: TCP/IP Threadübergabe von Clienten ( INVOKE) ? 
Autor: S3Ri0US
Datum: 15.06.09 16:05

Ok danke.. habe ich in der FOrensuche folgenden Code gefunden:

Private Delegate Sub LogDelegate(ByVal text As String)
 
Private Sub Log(ByVal text As String)
  If ListView1.IsInvokeRequeiered() Then
    ListView1.Invoke(New LogDelegate(AddressOf Log), text)
  Else
    ListView1.Items.Add(text)
  End If
End Sub
wenn ich es aber mit dieser Methode mache, müsste ich jedes Control auf meiner hauptform Invoken. Kann man da nicht gleich eine ganze Form mit Controls invoken ?

Danke für die Hilfe.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: TCP/IP Threadübergabe von Clienten ( INVOKE) ? 
Autor: ModeratorDaveS (Moderator)
Datum: 15.06.09 17:30

Es ist egal welches Control oder welche Form, es geht nur darum zu welchem Thread die gehören, und das wird meistens der gleiche sein. Eine solche Routine kann also beliebige Controls/Forms im GUI Thread ansprechen.

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: TCP/IP Threadübergabe von Clienten ( INVOKE) ? 
Autor: S3Ri0US
Datum: 15.06.09 17:40

Ok Danke. ich habe nun meinen Code wie folgt geändet:

'Hauptform: 
Public Delegate Sub ClientCommandDelegate(ByVal command As String, ByVal ip As _
  String)
 
    Public Class handleClinet
        Dim clientSocket As TcpClient
        Dim clientsList As Hashtable
 
        Public Sub startClient(ByVal inClientSocket As TcpClient, ByVal cList _
          As Hashtable)
            Me.clientSocket = inClientSocket
            Me.clientsList = cList
            Dim ctThread As Threading.Thread = New Threading.Thread(AddressOf _
              doChat)
            ctThread.Start()
        End Sub
 
        Private Sub doChat()
            Dim infiniteCounter As Integer
            Dim bytesFrom(10024) As Byte
            Dim dataFromClient As String
            For infiniteCounter = 1 To 2
                infiniteCounter = 1
                Try
                    Dim networkStream As NetworkStream = clientSocket.GetStream( _
                      )
                    networkStream.Read(bytesFrom, 0, CInt( _
                    clientSocket.ReceiveBufferSize))
                    dataFromClient = System.Text.Encoding.ASCII.GetString( _
                    bytesFrom)
                    Check_ClientCommand(dataFromClient, _
                    clientSocket.Client.RemoteEndPoint.ToString)
                Catch ex As Exception
                    clientSocket.Close()
                    MsgBox(ex.ToString)
                End Try
            Next
        End Sub
 
        Public Sub Check_ClientCommand(ByVal command As String, ByVal ip As _
          String)
 
            Dim broadcastStream As NetworkStream = clientSocket.GetStream()
            Dim broadcastBytes As [Byte]()
 
            If clienten.list.InvokeRequired Then
                clienten.list.Invoke(New ClientCommandDelegate(AddressOf _
                  Check_ClientCommand), command, ip)
            Else
                'prüfen ob ip bereits in Liste:
                Dim found As Boolean = False
                For i = 0 To clienten.list.Items.Count - 1
                    If (clienten.list.Items.Item(i).Text = ip) Then found = True
                Next
                If (found = False) Then
                    Dim NewID As Integer = clienten.list.Items.Count
                    clienten.list.Items.Add("")
                    clienten.list.Items(NewID).Text = "Anfrage..."
                    clienten.list.Items(NewID).SubItems.Add(ip)
                End If
            End If
 
            broadcastBytes = Encoding.ASCII.GetBytes("test")
            broadcastStream.Write(broadcastBytes, 0, broadcastBytes.Length)
            broadcastStream.Flush()
        End Sub
    End Class
im Public Sub Check_ClientCommand ist nun mein Invoke drin.. wenn ich nun ein Debug mit Haltepunkte druchlaufen lasse geht alles wunderbar und die variable IP ist auch als String vorhanden. Aber die ListView (clienten.list) bleibt leer !
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel