begin process at 2012 02 13 03:36:17
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseau & Internet

 > TCPLISTENER - DEUX EXEMPLES D'UTILISATION : AVEC ET SANS BACKGROUNDWORKER

TCPLISTENER - DEUX EXEMPLES D'UTILISATION : AVEC ET SANS BACKGROUNDWORKER


 Information sur la source

Note :
Aucune note
Catégorie :Réseau & Internet Source .NET ( DotNet ) Classé sous :TcpListener, BackGoundWorker, Reseau Niveau :Débutant Date de création :18/01/2008 Vu / téléchargé :8 328 / 388

Auteur : COlive

Ecrire un message privé
Site perso
Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note

 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.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source .NET (Dotnet) COMBODATA ACCES - LISTE UN CHAMP ET DONNE SON INDEX DANS LA...
Source avec Zip Source .NET (Dotnet) RÉCUPÉRER FICHIER SUR FTP
Source avec Zip DLL DE CONNEXION FTP POUR NET EN VB6
Source avec Zip Source .NET (Dotnet) WINADMIN - GESTION ET ADMINISTRATION RÉSEAU
Source avec Zip WINADMIN - GESTION RÉSEAU LOCAL

 Sources de la même categorie

Source avec Zip Source avec une capture GESTIONNAIRE DE TÉLÉCHARGEMENT, AVEC REPRISE ET MULTITHREADI... par Madx23
Source avec Zip Source avec une capture CONVERTIR DU TEXTE RTF EN CODE HTML ET VICE-VERSA par vicosta
Source avec Zip Source avec une capture DICTIONAIRE TEXT/AUDIO/VISUELLE ANGLAIS AVEC WEBBROWSER CONT... par majnounmajda
Source avec Zip Source .NET (Dotnet) NSLOOKUP EN VB.NET OU COMMENT FAIRE UNE REQÛETE DNS EN PRÉCI... par ShareVB
Source avec Zip Source avec une capture MINI SEVEUR HTTP AVEC INTERFACE GRAPHIQUE ET IMPLÉMENTATIONS... par lemout

 Sources en rapport avec celle ci

Source avec une capture LISTE DES PC DU RESEAU par alfamick
Source avec Zip SAUVEGARDE DES DONNÉES D'UN RÉSEAU EN VBSCRIPT par vsgn
RÉCUPÉRATION D'INFOS DE FILM par mich95
Source avec Zip Source avec une capture DISTRIBUTION DE FICHIERS EN RESEAU par alfamick
Source avec Zip LE MOT LE PLUS LONG EN RESEAU par fabienenvac

Commentaires et avis

Commentaire de Kite37 le 22/09/2008 19:34:06

hum dans ta boucle while, pourquoi fermer et redémarrer a chaque fois le tcpListener?

Commentaire de COlive le 22/09/2008 23:44:48

Question très pertinante. En fait je dois avouer ne pas avoir tester avec le start et le stop en dehors de la boucle, cela ne devrait pas poser de problème, et éviterait même une micro perte de demande de connexion.

Toutefois, je suppose qu'un m_tcpl.stop doit être stoppé après avoir effectué m_tcpl.AcceptTcpClient pour qu'à nouveau suite donc à un nouveau start accepté de nouveau une connexion.

A vérifier donc.

Commentaire de Kite37 le 23/09/2008 12:16:28

Dans une situation ou tu n'attends de connexion que d'un unique client, pas besoin demettre start/stop da s la boucle je pense.

par contre, si les infos peuvent venir de n'importe où, dans ce cas pourquoi pas ^^

 Ajouter un commentaire


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


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,574 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales