Accueil > > > TCPLISTENER - DEUX EXEMPLES D'UTILISATION : AVEC ET SANS BACKGROUNDWORKER
TCPLISTENER - DEUX EXEMPLES D'UTILISATION : AVEC ET SANS BACKGROUNDWORKER
Information sur la source
Description
Cette petite solution en VB 2005 sans prétention montre comment utiliser un tcplistener selon deux méthodes. Donc j'ai crée deux classes générant des évennements. La classe Ecouteur utilise un Backgroundworker pour utiliser le tcplistener sans geler la classe elle même ou le programme utilisant la classe. La classe TcpListener utilise un timer pour surveiller la propriètè pending du tcplistener, ce qui ne gelepas non plus la classe elle même ou le programme utilisant la classe. J'ai essayer de bien documenter les deux classes afin de bien comprendre comment fonctionne le TcpListener ainsi que le BackgroundWorker En Exemple ci dessous la classe sans Backgroundworker
Source
- Imports System.Net
- Imports System.Net.Sockets
- Imports System.ComponentModel
- Imports System.io
-
- Public Class Ecouteur
- #Region "Déclarations locales"
- Private m_tcpl As TcpListener
- Private WithEvents m_thread As BackgroundWorker
- Private m_Etat As String
- Private Structure DtTcp 'Objet utiliser pour intercommunication entre thread et controle Ecouteur
- Dim sIP As IPAddress
- Dim sPort As Integer
- Dim sData As String
- End Structure
- Private m_dttcp As DtTcp
- #End Region
-
- #Region "Déclarations Evénements"
- Public Event ErreurEcouter(ByVal Msg As String)
- Public Event Etat(ByVal Etat As String)
- Public Event DonneeRecu(ByVal MessageRecu As String)
- #End Region
-
- Public Sub New(ByVal IP As IPAddress, ByVal Port As Integer)
- m_dttcp.sIP = IP
- m_dttcp.sPort = Port
- m_dttcp.sData = ""
- End Sub
-
- Public Sub Ecouter()
- Try
- 'Paramètrage du backgroundworker
- m_thread = New BackgroundWorker
- m_thread.WorkerReportsProgress = True
- m_thread.WorkerSupportsCancellation = True
- 'Déclaration des procédure pour gérer les evenements du backgroundworker
- AddHandler m_thread.DoWork, AddressOf m_thread_DoWork
- AddHandler m_thread.ProgressChanged, AddressOf m_thread_ProgressChanged
- 'Si pas déjà en execution lance le backgoundworker
- If Not m_thread.IsBusy Then m_thread.RunWorkerAsync(m_dttcp)
- Catch ex As Exception
- 'Déclenche Evenement Erreur
- RaiseEvent ErreurEcouter(ex.Message)
- End Try
- End Sub
-
- Public Sub Arreter()
- Try
- 'Demande l'arret par cancel du backgroundworker
- m_thread.CancelAsync()
- 'Création d'un client local pour déclencher la boucle infinie du backgroundworker
- Dim TmpTcp As System.Net.Sockets.TcpClient
- Dim StrCli As System.Net.Sockets.NetworkStream
- Dim StrW As System.IO.StreamWriter
- TmpTcp = New System.Net.Sockets.TcpClient
- TmpTcp.Connect(m_dttcp.sIP, m_dttcp.sPort)
- StrCli = TmpTcp.GetStream()
- StrW = New System.IO.StreamWriter(StrCli)
- StrW.Write("truc pour declencher le AcceptTcpClient dans le thread")
- StrW.Close()
- StrCli.Close()
- TmpTcp.Close()
- 'Déclenche Evenement Etat avec info déconnecté
- RaiseEvent Etat("Déconnecté")
- Catch ex As Exception
- 'Déclenche Evenement Erreur
- RaiseEvent ErreurEcouter(ex.Message)
- End Try
- End Sub
-
-
- #Region "Fonctions du thread"
- Private Sub m_thread_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles m_thread.DoWork
- 'Recup Thread
- Dim LocThread As BackgroundWorker = CType(sender, BackgroundWorker)
- 'Recup Data
- Dim LocDtTcp As DtTcp = e.Argument
- 'Créer Composant
- m_tcpl = New TcpListener(LocDtTcp.sIP, LocDtTcp.sPort)
- Try
- Dim TcpCli As TcpClient
- Dim m_str As NetworkStream
- Dim m_read As StreamReader
- Dim msg As String
- While Not LocThread.CancellationPending 'Controle si arrêt demander
- m_tcpl.Start() 'Mise en attente de connection
- LocDtTcp.sData = "Attente connexion"
- LocThread.ReportProgress(1, LocDtTcp) 'Mise à jour Etat hors du thread
- '-------------------------------------------------------------------
- 'Boucle de controle de demande connections entrantes ou d'annulation
- 'Cette boucle a été supprimé et la procédure arreter modifiee pour déclencher le acceptcpclient
- 'Car cette boucle utilisait des ressources processeurs non négligeable (freeze du thread)
- ' While True
- 'If m_tcpl.Pending() Then Exit While
- 'If LocThread.CancellationPending Then
- ' m_tcpl.Stop()
- ' Exit While
- ' End If
- 'End While
- '-------------------------------------------------------------------
- TcpCli = m_tcpl.AcceptTcpClient() 'Créer un tcpclient pour récuperer les données
- LocDtTcp.sData = "Connecté"
- LocThread.ReportProgress(2, LocDtTcp) 'Mise à jour Etat hors du thread
- m_str = TcpCli.GetStream 'Recup des données envoyées
- m_read = New StreamReader(m_str) 'Lecteur du flux
- msg = m_read.ReadToEnd 'Recup des données envoyées
- m_read.Close()
- m_str.Close()
- LocDtTcp.sData = msg
- LocThread.ReportProgress(3, LocDtTcp) 'Transfert du message hors du thread
- m_tcpl.Stop()
- End While
- e.Cancel = True
- Catch ex As Exception
- m_tcpl.Stop()
- LocDtTcp.sData = "Erreur : " + ex.Message
- LocThread.ReportProgress(1, LocDtTcp)
- End Try
- End Sub
-
- Private Sub m_thread_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles m_thread.ProgressChanged
- Dim RepDtTcp As DtTcp = e.UserState
- If e.ProgressPercentage = 1 Then
- RaiseEvent Etat("Attente connection")
- ElseIf e.ProgressPercentage = 2 Then
- RaiseEvent Etat("Connecté")
- ElseIf e.ProgressPercentage = 3 Then
- RaiseEvent DonneeRecu(RepDtTcp.sData)
- End If
- End Sub
-
- #End Region
-
- End Class
Imports System.Net
Imports System.Net.Sockets
Imports System.ComponentModel
Imports System.io
Public Class Ecouteur
#Region "Déclarations locales"
Private m_tcpl As TcpListener
Private WithEvents m_thread As BackgroundWorker
Private m_Etat As String
Private Structure DtTcp 'Objet utiliser pour intercommunication entre thread et controle Ecouteur
Dim sIP As IPAddress
Dim sPort As Integer
Dim sData As String
End Structure
Private m_dttcp As DtTcp
#End Region
#Region "Déclarations Evénements"
Public Event ErreurEcouter(ByVal Msg As String)
Public Event Etat(ByVal Etat As String)
Public Event DonneeRecu(ByVal MessageRecu As String)
#End Region
Public Sub New(ByVal IP As IPAddress, ByVal Port As Integer)
m_dttcp.sIP = IP
m_dttcp.sPort = Port
m_dttcp.sData = ""
End Sub
Public Sub Ecouter()
Try
'Paramètrage du backgroundworker
m_thread = New BackgroundWorker
m_thread.WorkerReportsProgress = True
m_thread.WorkerSupportsCancellation = True
'Déclaration des procédure pour gérer les evenements du backgroundworker
AddHandler m_thread.DoWork, AddressOf m_thread_DoWork
AddHandler m_thread.ProgressChanged, AddressOf m_thread_ProgressChanged
'Si pas déjà en execution lance le backgoundworker
If Not m_thread.IsBusy Then m_thread.RunWorkerAsync(m_dttcp)
Catch ex As Exception
'Déclenche Evenement Erreur
RaiseEvent ErreurEcouter(ex.Message)
End Try
End Sub
Public Sub Arreter()
Try
'Demande l'arret par cancel du backgroundworker
m_thread.CancelAsync()
'Création d'un client local pour déclencher la boucle infinie du backgroundworker
Dim TmpTcp As System.Net.Sockets.TcpClient
Dim StrCli As System.Net.Sockets.NetworkStream
Dim StrW As System.IO.StreamWriter
TmpTcp = New System.Net.Sockets.TcpClient
TmpTcp.Connect(m_dttcp.sIP, m_dttcp.sPort)
StrCli = TmpTcp.GetStream()
StrW = New System.IO.StreamWriter(StrCli)
StrW.Write("truc pour declencher le AcceptTcpClient dans le thread")
StrW.Close()
StrCli.Close()
TmpTcp.Close()
'Déclenche Evenement Etat avec info déconnecté
RaiseEvent Etat("Déconnecté")
Catch ex As Exception
'Déclenche Evenement Erreur
RaiseEvent ErreurEcouter(ex.Message)
End Try
End Sub
#Region "Fonctions du thread"
Private Sub m_thread_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles m_thread.DoWork
'Recup Thread
Dim LocThread As BackgroundWorker = CType(sender, BackgroundWorker)
'Recup Data
Dim LocDtTcp As DtTcp = e.Argument
'Créer Composant
m_tcpl = New TcpListener(LocDtTcp.sIP, LocDtTcp.sPort)
Try
Dim TcpCli As TcpClient
Dim m_str As NetworkStream
Dim m_read As StreamReader
Dim msg As String
While Not LocThread.CancellationPending 'Controle si arrêt demander
m_tcpl.Start() 'Mise en attente de connection
LocDtTcp.sData = "Attente connexion"
LocThread.ReportProgress(1, LocDtTcp) 'Mise à jour Etat hors du thread
'-------------------------------------------------------------------
'Boucle de controle de demande connections entrantes ou d'annulation
'Cette boucle a été supprimé et la procédure arreter modifiee pour déclencher le acceptcpclient
'Car cette boucle utilisait des ressources processeurs non négligeable (freeze du thread)
' While True
'If m_tcpl.Pending() Then Exit While
'If LocThread.CancellationPending Then
' m_tcpl.Stop()
' Exit While
' End If
'End While
'-------------------------------------------------------------------
TcpCli = m_tcpl.AcceptTcpClient() 'Créer un tcpclient pour récuperer les données
LocDtTcp.sData = "Connecté"
LocThread.ReportProgress(2, LocDtTcp) 'Mise à jour Etat hors du thread
m_str = TcpCli.GetStream 'Recup des données envoyées
m_read = New StreamReader(m_str) 'Lecteur du flux
msg = m_read.ReadToEnd 'Recup des données envoyées
m_read.Close()
m_str.Close()
LocDtTcp.sData = msg
LocThread.ReportProgress(3, LocDtTcp) 'Transfert du message hors du thread
m_tcpl.Stop()
End While
e.Cancel = True
Catch ex As Exception
m_tcpl.Stop()
LocDtTcp.sData = "Erreur : " + ex.Message
LocThread.ReportProgress(1, LocDtTcp)
End Try
End Sub
Private Sub m_thread_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles m_thread.ProgressChanged
Dim RepDtTcp As DtTcp = e.UserState
If e.ProgressPercentage = 1 Then
RaiseEvent Etat("Attente connection")
ElseIf e.ProgressPercentage = 2 Then
RaiseEvent Etat("Connecté")
ElseIf e.ProgressPercentage = 3 Then
RaiseEvent DonneeRecu(RepDtTcp.sData)
End If
End Sub
#End Region
End Class
Conclusion
A vous d'exploiter cet exemple au mieux.
Je ne gère que de string en données envoyée / reçue, le but de l'exemple n'étant pas d'échanger tout type de données, mais de pouvoir établir une connection qui ne freeze pas l'application.)
Cordialement.
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
PROGRAMMATION RESEAU [ par Cécile ]
Bonjour,J'ai déjà écrit en vb un jeu comme le MORPION, la première qui aligne trois croix ou cercle a gagnée. Mais nous devons jouer côte à côte sur l
connecter un lecteur reseau. [ par Patrice ]
Salut,J'aimerais savoir comment connecterun lecteur reseau en VB.MERCI!!!
execution d'une application vb5/reseau nt4/1processeures [ par caandoit_ma ]
l'execution de mes application sur un poste de mon LAN fait trop du temps pour acceder au donnée par contre sur mon cerveur il marche parfaitementet b
Reseau avec Hub [ par yobogs ]
Bonjour,Je vous explique mon pb:J'ai deux PC que j'aimerai mettre en réseau avec un Hub de sorte à ce que les deux puissent avoir ma connection intern
connexion reseau en VB4 [ par Lau ]
Quelle solution existe t-il pour connecter un lecteur réseau en VB4 avec eventuellement les API Windows.Merci de votre collaboration.
Recupération de donnees en reseau [ par steph ]
salutmon probleme :j'ai 2 ordinateurs P1, P2 relié ensembleComment faire en Vb pour utiliser les fichiers partages de P2 dans un programme Vb sur P1.p
Nom des postes sur le reseau ! [ par RVTT ]
Bonjour a tous !Comment puis-je faire pour récuperer la liste des noms de postes disponible sur le reseau ?merci !
observateur reseau de windows [ par alain_henneuse ]
comment créé un jounal des fichiers ouvert dans l'observateur reseau de windows
Scan reseau [ par Membraxe ]
Salut a tous ,Je voudrais savoir comment faire pour avoir la liste des ordinateurs existantsur un reseau local et leurs adresse IP.Merci de me repondr
version Os en reseau [ par Membraxe ]
Salut ,je voudrais savoir comment fairepour recuperer sur les PC de mon reseau local les versions de windows.Merci d'avance
|
Derniers Blogs
[WP7] DYNAMICALLY CHANGE STARTUP PAGE[WP7] DYNAMICALLY CHANGE STARTUP PAGE par KooKiz
Let's say that you want to allow the user to customize the startup page of your application. You can easily change the startup page by editing the 'NavigationPage' attribute in the manifest file. But the manifest cannot be modified once the applicatio...
Cliquez pour lire la suite de l'article par KooKiz SESSION SILVERLIGHT 5 3D : SLIDES ET DEMOSSESSION SILVERLIGHT 5 3D : SLIDES ET DEMOS par Groc
Durant les techdays, j'ai eu le plaisir d'animer une session sur Silverlight 5 et la 3D avec Simon Ferquel. Comme promis, voici nos slides et mes démos (celles avec le viper BSG) ici et là. Pour mémoire, les démos utilisent toutes le viper BSG...
Cliquez pour lire la suite de l'article par Groc [TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES[TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES par gpommier
Suite à la session que j'ai présenté sur WebMatrix 2, vous pouvez trouver les slides ici, ainsi que les démos en packages nuget : démos1 et démos2 J'en profite pour remercier chaleureusement tous ceux qui sont venus très nombreux à cette sess...
Cliquez pour lire la suite de l'article par gpommier [SHAREPOINT] LES SESSIONS TECHDAYS 2012.[SHAREPOINT] LES SESSIONS TECHDAYS 2012. par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article par Patrick Guimonet TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Forum
LISTER KEYS.KEYLISTER KEYS.KEY par Onin42
Cliquez pour lire la suite par Onin42
Logiciels
Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning
|