mardi 28 mai 2013

Exemple pour se connecter à un WAN avec VB.NET

Exemple pour se connecter à un WAN avec VB.NET


Petit exemple en  VB.NET pour se connecter à un serveur distant


Le choix d'un langage de programmation pour rendre votre programme intéressant n'est qu'une partie d'un projet informatique. Vous devez également choisir le protocole réseau à utiliser.
Le protocole de réseau IPv4  représenté dans la couche réseau 3 du modèle OSI est le plus populaire. Pourquoi? Je ne sais pas. Peut-être que les gens ordinaires ont connu les adresses internet et les adresses IP.
Quoi qu'il en soit, la plupart des gens ne maîtrisent pas ou savent même tous les protocoles disponibles dans le monde. Heureusement, Microsoft a fait framework  .NET avec beaucoup de protocoles réseau tout en une seule énumération: AddressFamily

Voici quelque exemple dans AddressFamily:
  • InterNetwork
  • InterNetworkV6
  • NetBios
  • AppleTalk
  • HyperChannel
  • Unknown
  • Unspecified


Si vous ne spécifie pas un AddressFamily, votre programme ne sera pas en mesure de résoudre une adresse. Par exemple, si vous définissez votre programme pour InterNetwork (IPv4), votre programme s’attendra à une adresse IPv4 quand il va se connecter au point de terminaison.
Voici un exemple avec un minimum de code pour se connecter à un serveur avec l’utilisation: “AddressFamily. InterNetwork”


Imports System
Imports System.Text
Imports System.IO
Imports System.Net
Imports System.Net.Sockets
''' <summary>
''' This is a sample on how to conenct to a server using the
''' minimum stuff in IPv4.
''' Base from an example from MSDN.
''' </summary>
''' <remarks></remarks>
Module Module1

    Sub Main()
        Dim aString As String
        Dim s As Socket = Nothing
        Dim hostEndPoint As IPEndPoint
        Dim hostAddress As IPAddress = Nothing
        Dim conPort As Integer = 80


        ' Get DNS host information.
        Dim hostInfo As IPHostEntry ' = Dns.Resolve(server)
        ' Get the DNS IP addresses associated with the host.
        Dim IPaddresses As IPAddress() '= hostInfo.AddressList
        Try
            Do
                Console.Write("host to test (exemple : www.yahoo.com) ?  ")
                aString = Console.ReadLine()
                hostInfo = Dns.Resolve(aString)

                Console.Write("port to test (exemple : 80) ? ")
                aString = Console.ReadLine()
                conPort = aString


                IPaddresses = hostInfo.AddressList

                For index = 0 To IPaddresses.Length - 1
                    hostAddress = IPaddresses(index)
                    hostEndPoint = New IPEndPoint(hostAddress, conPort)


                    ' Creates the Socket to send data over a TCP connection.
                    s = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)

                    ' Connect to the host using its IPEndPoint.
                    s.Connect(hostEndPoint)

                    If Not s.Connected Then
                        ' Connection failed, try next IPaddress.
                        Console.Write("Unable to connect to host")
                        s = Nothing

                    Else
                        Console.Write("connected to host !  ")
                    End If

                Next index  ' End of the for loop.



                Console.Write("Quit or Retry? (Q/R)")
                aString = Console.ReadLine()

            Loop Until aString = "Q" Or aString = "q"
        Catch ex As Exception

        End Try

    End Sub


End Module




J’utilise Microsoft Visual Studio 2010 dans tous mes projets. Je vous suggère de vous procurer le vôtre sur Amazon: Microsoft Visual Studio 2012 sur  Amazon
ou
Télécharger le projet exemple ici: SampleConsoleIPv4.zip

Autres lectures intéressantes en anglais:



jeudi 23 mai 2013

Exemple de synchronisation de threads en VB.NET

Exemple de synchronisation de threads


Se réfère à l'idée d'utiliser des multiples thread dans un processus



Lorsque vous utilisez des plusieurs threads, vous remarquerez que la vitesse de chaque thread  n'est pas très important. Vous remarquerez que la synchronisation est plus importante parce que bien souvent, vous voulez un thread  se compléter avant d’en commencer une autre. Vous pouvez essayer d'utiliser ou de vérifier l'état du thread  en utilisant les propriétés IsBackground ou IsAlive, mais vous verrez que la tâche sera ardue
C'est pourquoi la synchronisation entre les tâches asynchrones est la clé de la réussite. Si vous maîtrisez la base de la synchronisation entre les fonctions, rien ne vous empêche de faire des applications ou des jeux plus complexes.

Le MMORPG (Massive est synonyme de rôle en ligne multi joueur match) est le parfait exemple de défi pour un programmeur ou une équipe où chaque joueur fonctionne avec différente vitesses de l'ordinateur et performances du réseau.

Voici un exemple de code que j'ai fait en moins de 15 minutes. Oui, il est très simple. Le concept est aussi simple. J'ai fait une WinForm avec 4 ProgressBar. Le dernier ProgressBar ne démarrera pas si les 3 précédentes ont terminé. En d'autres termes, le dernier ProgressBar doit attendre que les 3 autres.

Cet échantillon pourrait être utilisé dans n'importe quelle situation dans le monde moderne.

En appuyant sur la touche START, 4 threads indépendants vont commencer. Chaque thread a leur propre vitesse.

Le dernier sujet est bloqué par 3 ManualResetEvent. Si le 3 ManualResetEvent sont définies, puis la dernière tâche pourrait commencer.



''' <summary>
''' Author : Check-Kay Wong
''' Description:
''' This is a sample of synchronasation between multiples task
''' using a Simple WaitOne and a Set from a ManualResetEvent
'''
''' Comment : this is an exemple
''' </summary>
''' <remarks></remarks>
Public Class Form1

    Private tTask1 As System.Threading.Thread
    Private tTask2 As System.Threading.Thread
    Private tTask3 As System.Threading.Thread
    Private tTask4 As System.Threading.Thread

    Private mreTask1 As System.Threading.ManualResetEvent
    Private mreTask2 As System.Threading.ManualResetEvent
    Private mreTask3 As System.Threading.ManualResetEvent
    Private mreTask4 As System.Threading.ManualResetEvent

    Private Delegate Sub dTask1()
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        StartAllTasks()
    End Sub
    ''' <summary>
    ''' all working stuff inside the thread are simulated by progressbar
    ''' </summary>
    ''' <remarks></remarks>
#Region "Working Thread 1, 2 and 3"
    Private Sub Task1()
        Do
            Me.BeginInvoke(New dTask1(AddressOf sTask1))
            System.Threading.Thread.Sleep(100)
        Loop Until ProgressBar1.Value >= ProgressBar1.Maximum
        mreTask1.Set()
    End Sub
    Private Sub sTask1()
        Me.ProgressBar1.PerformStep()
    End Sub

    Private Sub Task2()
        Do
            Me.BeginInvoke(New dTask1(AddressOf sTask2))
            System.Threading.Thread.Sleep(100)
        Loop Until ProgressBar2.Value >= ProgressBar2.Maximum
        mreTask2.Set()
    End Sub
    Private Sub sTask2()
        Me.ProgressBar2.PerformStep()
    End Sub

    Private Sub Task3()
        Do
            Me.BeginInvoke(New dTask1(AddressOf sTask3))
            System.Threading.Thread.Sleep(100)
        Loop Until ProgressBar3.Value >= ProgressBar3.Maximum
        mreTask3.Set()
    End Sub
    Private Sub sTask3()
        Me.ProgressBar3.PerformStep()
    End Sub
#End Region
#Region "Finale Task Thread"
    Private Sub Task4()
        mreTask1.WaitOne()
        mreTask2.WaitOne()
        mreTask3.WaitOne()
        Do

            Me.BeginInvoke(New dTask1(AddressOf sTask4))
            System.Threading.Thread.Sleep(100)
        Loop Until ProgressBar4.Value >= ProgressBar4.Maximum
        mreTask4.Set()
        My.Computer.Audio.PlaySystemSound(Media.SystemSounds.Beep) 'a little bell
    End Sub
    Private Sub sTask4()
        Me.ProgressBar4.PerformStep()
    End Sub
#End Region

    ''' <summary>
    ''' Init stuff
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

        Me.Text = My.Application.Info.ProductName & " from " & My.Application.Info.CompanyName
        ProgressBar1.Maximum = 200
        ProgressBar2.Maximum = 100
        ProgressBar3.Maximum = 140
        ProgressBar4.Maximum = 240

        'create the ManualResetEvent
        mreTask1 = New System.Threading.ManualResetEvent(False)
        mreTask2 = New System.Threading.ManualResetEvent(False)
        mreTask3 = New System.Threading.ManualResetEvent(False)
        mreTask4 = New System.Threading.ManualResetEvent(False)
    End Sub

    ''' <summary>
    ''' Start All Task at the same time
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub StartAllTasks()
        If tTask1 IsNot Nothing Then tTask1 = Nothing
        tTask1 = New System.Threading.Thread(AddressOf Task1)
        tTask1.IsBackground = True
        tTask1.Start()

        If tTask2 IsNot Nothing Then tTask2 = Nothing
        tTask2 = New System.Threading.Thread(AddressOf Task2)
        tTask2.IsBackground = True
        tTask2.Start()

        If tTask3 IsNot Nothing Then tTask3 = Nothing
        tTask3 = New System.Threading.Thread(AddressOf Task3)
        tTask3.IsBackground = True
        tTask3.Start()

        If tTask4 IsNot Nothing Then tTask4 = Nothing
        tTask4 = New System.Threading.Thread(AddressOf Task4)
        tTask4.IsBackground = True
        tTask4.Start()
    End Sub

End Class


J'utilise Microsoft Visual Studio 2010 pour faire tous mes projets. Je vous suggère d'acheter et d'obtenir le meilleur IDE dans le monde et le plus récent: Microsoft Visual Studio 2012 sur Amazon
et
Télécharger le projet utilisé en exemple: ManualResetEventExample.zip

Voici d’autres sujet d’article qui pourraient vous intéresser.:


mercredi 8 mai 2013

Remplir un ComboBox avec un fichier texte

Remplir un ComboBox avec un fichier texte

Remplir une zone de liste déroulante rapidement par l'importation de données à partir d'un fichier texte


ComboBox SampleLes fichiers textes sont le moyen le plus simple pour stocker des données. Il requiert une connaissance minimale pour les utiliser. Savoir comment lire les fichiers textes vous permet ensuite des données dans un contrôle comme dans une zone de liste déroulante (ComboBox). Voici un exemple très simple. Il utilise un OpenFileDialog pour obtenir un fichier texte l'utilisateur demande. Le programme valide le fichier et si tout est juste, il charge chaque ligne et les mets dans le ComboBox1. Lorsque le curseur atteint la fin du fichier, la valeur de la propriété EndOfStream sera vraie. Cela permettra à votre programme de quitter la boucle et fermer en toute sécurité. N'oubliez pas de fermer le fichier de Stream lorsque vous avez terminé.
Téléchargez l'exemple du projet ici: ComboBoxSample.zip

ComboBox Sample

ComboBox Sample



    Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
        Dim oStream As IO.StreamReader
        Dim oOpenFileDialog As OpenFileDialog


        oOpenFileDialog = New OpenFileDialog
        oOpenFileDialog.SupportMultiDottedExtensions = False

        If oOpenFileDialog.ShowDialog = Windows.Forms.DialogResult.OK Then
            If IO.File.Exists(oOpenFileDialog.FileName) Then
                oStream = New IO.StreamReader(oOpenFileDialog.FileName)

                'Read all lines and add them into the ComboBox1
                Do Until oStream.EndOfStream = True
                    ComboBox1.Items.Add(oStream.ReadLine)
                Loop
                oStream.Close() 'very important to close the file
            End If
        End If


    End Sub



mardi 7 mai 2013

Créer votre premier événement dans Visual Basic

Créer votre premier événement dans Visual Basic


Comment créer vos propres événements en Visual Basic?

Plusieurs fois, vous savez comment utiliser des événements. Par exemple, vous mettez un bouton à l'intérieur d'un formulaire de fenêtre. En double-cliquant sur le bouton à l'intérieur du concepteur de formulaire, vous obtenez une fonction avec le mot-clé Handle à la fin de votre fonction.

Les événements sont très utiles pour exécuter une méthode ou un événement extérieur. Mais que faire si vous voulez créer votre propre événement?

Voici un article simple sur la façon de créer un événement à partir de zéro à partir d’une approche simple suivi par un exemple plus pratique.

Un moyen simple de créer un événement:

Tout d'abord, faisons un projet de base pour exécuter nos tests. Créer un formulaire de base de Windows dans Visual Basic. Nommez votre projet. Placez une zone de texte et un bouton. Double-cliquez sur le bouton et vous devriez avoir quelque chose comme ceci:


Public Class Form1

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

    End Sub
End Class


Maintenant, je veux créer une classe simple appelée FileClass. À l'intérieur de cette classe, il y aura une méthode simple pour créer un fichier. Dans la méthode CreateFile, assurez-vous de laisser assez de protection et de vérification. Si vous vérifiez si le chemin du fichier n'est pas vide et non nulle, la classe devrait ressembler à ceci:


Public Class FileClass

    Public Sub CreateFile(ByVal sPath As String)

        If sPath IsNot Nothing AndAlso sPath.Length > 0 Then
            If Not IO.File.Exists(sPath) Then
                IO.File.Create(sPath)
            Else
                MsgBox(sPath & " EXIST" & vbCrLf & "THIS PROGRAM CAN'T OVERITE EXISTING FILES)", MsgBoxStyle.Exclamation)
            End If
        End If

    End Sub
End Class



J'ai utilisé une fonction de System.IO, il n'y a rien de très spécial dans cette ligne.

Ajout des événements

Un événement est une simple variable avec un mot-clé: Event. Votre événement peut être public ou privé. Dans mon exemple, je vais créer un seul événement de type Event pour faire cela très facile. J’en ferai un public, à l'intérieur même  de mon FileClass et l'a nommé FileCreated. Voici ce que votre classe ressemblera à ceci: (en jaune, les nouvelles lignes que j'ai ajoutées).


Public Class FileClass

    'declare your event here
    Public Event FileCreated()


    Public Sub CreateFile(ByVal sPath As String)

        If sPath IsNot Nothing AndAlso sPath.Length > 0 Then
            If Not IO.File.Exists(sPath) Then
                IO.File.Create(sPath)
            Else
                MsgBox(sPath & " EXIST" & vbCrLf & "THIS PROGRAM CAN'T OVERITE EXISTING FILES)", MsgBoxStyle.Exclamation)
            End If
        End If

    End Sub
End Class



Maintenant que votre événement est disponible, je le répète: DISPONIBLE!! Vous pouvez tirer vers le bas de la liste déroulante dans votre Visual Studio vers le bas et insérer une fonction pour votre événement.


Après avoir cliqué sur FileCreated, Visual Studio crée un nouveau Sub automatiquement avec le mot-clé Handle à la fin. Votre le code devrait ressembler à ceci. Vous saurez qu'il n'y a rien venant de nulle part. Tout est fabriqué à partir de votre code.

Public Class FileClass

    'declare your event here
    Public Event FileCreated()


    Public Sub CreateFile(ByVal sPath As String)

        If sPath IsNot Nothing AndAlso sPath.Length > 0 Then
            If Not IO.File.Exists(sPath) Then
                IO.File.Create(sPath)
            Else
                MsgBox(sPath & " EXIST" & vbCrLf & "THIS PROGRAM CAN'T OVERITE EXISTING FILES)", MsgBoxStyle.Exclamation)
            End If
        End If

    End Sub

    Private Sub FileClass_FileCreated() Handles Me.FileCreated
        MsgBox("FileCreated Event triggered")
    End Sub
End Class



À l'intérieur de cette classe et de cette méthode Sub, vous pouvez mettre tout ce que vous voulez. J'ai choisi de mettre une boîte de message simple avec un petit message à l'intérieur.
Mais pour faire fonctionner un événement, vous devez faire un appel de fonction pour déclencher l'événement en utilisant le mot-clé RaiseEvent. Pour faire très simple, j'ai décidé de le placer à l'intérieur et à la fin de CreateFile. Il devrait ressembler à ceci. Par ailleurs, certaines personnes pourraient appeler cela comme un événement d'interruption. Un gars électronique comme moi va appeler ces types d'événements comme IRQ (de l’anglais : Interrupt Request).

Public Class FileClass

    'declare your event here
    Public Event FileCreated()


    Public Sub CreateFile(ByVal sPath As String)

        If sPath IsNot Nothing AndAlso sPath.Length > 0 Then
            If Not IO.File.Exists(sPath) Then
                IO.File.Create(sPath)
            Else
                MsgBox(sPath & " EXIST" & vbCrLf & "THIS PROGRAM CAN'T OVERITE EXISTING FILES)", MsgBoxStyle.Exclamation)
            End If
        End If

        RaiseEvent FileCreated() 'add the trigger (interrupt)

    End Sub

    Private Sub FileClass_FileCreated() Handles Me.FileCreated
        MsgBox("FileCreated Event triggered")
    End Sub
End Class



Si vous créez votre objet et appelez votre méthode CreateFile, vous aurez MessageBox après que le fichier a été créé.

Public Class Form1

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim oFileClass As New FileClass
        oFileClass.CreateFile(TextBox1.Text)

    End Sub
End Class




Quel est l'avantage de faire cela?
Lorsque votre événement appelle une fonction à l'intérieur d'une classe, vous pouvez facilement faire un comportement par défaut de votre classe. Voici un exemple d'un bouton amélioré hérité d'un bouton de base. À l'intérieur de la classe, il y a un événement MouseHover par défaut pour ce bouton. Ce bouton change de couleur lorsque le curseur est dessus.
Reference: Inherits Button (Artticle en Anglais)

AddHandler est un moyen plus pratique d'utiliser un événement.

Vous êtes maintenant capable de faire un événement. Félicitation pour vous. Mais faire un événement comme la page précédente n'est pas très pratique, car vous ne pouvez pas gérer les événements. Normalement, vous voulez commencer et arrêter vos événements. Vous souhaitez contrôler vos actions du programme.


Avec l'exemple précédent avec le FileClass de classe à l'intérieur du Form1, assurons-nous que le Form1 gère les événements de FileClass.

Voici une petite modification de mon Form1:

Public Class Form1

    Private oFileClass As New FileClass 'i know i put NEW here

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

        oFileClass.CreateFile(TextBox1.Text)

    End Sub

End Class



Je mets simplement ma déclaration en dehors de ma méthode Button1. De cette façon, tout ce qui sera à l'intérieur de ma Form1 pourrait accéder à mon object FileClass. À l'heure actuelle, si vous exécutez votre programme, il n’y aura pas de changements visibles. Tout devrait fonctionner de la même façon.

Maintenant, je vais ajouter méthode dans ma Form1. A l'intérieur de cette méthode aura simple MsgBox. J'ai décidé de nommer ce myCreateFile Sub ().

Public Class Form1

    Private oFileClass As New FileClass 'i know i put NEW here

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

        oFileClass.CreateFile(TextBox1.Text)

    End Sub

    Private Sub myCreateFile()
        MsgBox("Create file for the user")
    End Sub

End Class

Encore une fois, si vous exécutez votre programme, il y aura rien de spécial. Maintenant, la bonne partie commence. Seulement si votre objet de classe avec des événements est créé, vous pouvez utiliser le AddHandler pour faire un événement à l'exécution par programme. AddHandler est une fonction à l'intérieur de Visual Basic qui raconte votre programme ceci:
“From now on, if my object does something, then call my function.”
"À partir de maintenant, si mon objet fait quelque chose, alors appelle ma fonction."


Public Class Form1

    Private oFileClass As New FileClass 'i know i put NEW here

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

        oFileClass.CreateFile(TextBox1.Text)

    End Sub

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

        AddHandler oFileClass.FileCreated, AddressOf myCreateFile

    End Sub

    Private Sub myCreateFile()
        MsgBox("Create file for the user")
    End Sub

End Class


Le mot clé AddHandler utilisé à l'intérieur de Form Load dit simplement à votre programme que chaque fois FileCreated est déclenchée, appelez myCreateFile. De cette façon, et d'une certaine façon, vous donnez l'impression que la forme contrôle l'objet FileClass.
Si vous lancez votre programme, le myCreateFile sera prêt parce que le gestionnaire est créé à l'intérieur de la fonction Load. Si vous appuyez sur le Button1 pour appeler votre méthode CreateFile de votre objet, vous remarquerez qu'il y aura deux boîtes de message. Le premier sera de votre classe et l'autre viendra de votre Form1.
Important: Vous pouvez ajouter multiples addHandler pour les mêmes événements. Par exemple:

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

        'this line activate myCreateFile base from oFileClass.FileCreated
        'anytime from now on.
        AddHandler oFileClass.FileCreated, AddressOf myCreateFile
        AddHandler oFileClass.FileCreated, AddressOf myCreateFile2
        AddHandler oFileClass.FileCreated, AddressOf myCreateFile3

    End Sub


RemoveHandler :


Chaque AddHandler enregistrer un événement à l'intérieur de votre programme. Vous pouvez désinscrire des événements en utilisant la même syntaxe que la AddHandler avec RemoveHandler. Si vous voulez annuler l'inscription de tous les événements d'un objet, vous devez tous les désinscrire un par un.
Par exemple: (l'ordre n'est pas important)

        RemoveHandler oFileClass.FileCreated, AddressOf myCreateFile
        RemoveHandler oFileClass.FileCreated, AddressOf myCreateFile2
        RemoveHandler oFileClass.FileCreated, AddressOf myCreateFile3


Throw exception


Avant de terminer cet article, laissez-moi vous donner un conseil. Puisque ce type de sujet est pour les utilisateurs intermédiaires, je recommande que chaque événement doit être simple, petit et sans erreur. Cela signifie que dans mon exemple montré ici, CreateFile dans ma FileClass doit être très robuste et si possible ne jamais jeter toute erreur. En d'autres termes, si je veux déclencher un événement après la création d'un fichier, je dois être sûr que ça va marcher.

Votre code doit exécuter très rapidement aussi parce que l'utilisation AddHandler et RemoveHandler vous initier à la programmation asynchrone. D'autre part, utiliser des fonctions Delegate à l'intérieur de votre Form1 (myCreateFile, myCreateFile2, myCreateFile3 ...) permet de mettre du code plus lent ou pour de plus gros calculs.

Si vous avez aimé mon poste, s'il vous plaît le partager à vos amis, marquer ou à laisser un commentaire.
Télécharger l'exemple de projet ici:  NewEventSample.zip