| |
VB.NET - Ein- und UmsteigerTCP/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. | |
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. | |
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 ! | |
| 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 |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats sevZIP40 Pro DLL
Zippen und Unzippen wie die Profis!
Mit nur wenigen Zeilen Code statten Sie Ihre Anwendungen ab sofort mit schnellen Zip- und Unzip-Funktionen aus. Hierbei lassen sich entweder einzelnen Dateien oder auch gesamte Ordner zippen bzw. entpacken. Weitere Infos
|
|
|
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
|
|