IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Serveur Sockets TCP


Sujet :

VB.NET

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 52
    Points : 31
    Points
    31
    Par défaut Serveur Sockets TCP
    Bonjour à tous,

    Je dois réaliser un serveur de sockets TCP qui me permettra de recevoir des trames pour les réémettre sur une liaison série.
    Il peut y avoir plusieurs clients TCP qui se connecteront en simultané.

    En cherchant sur internet j'ai trouvé l'exemple suivant de Microsoft : https://msdn.microsoft.com/fr-fr/lib...vs.110%29.aspx

    Ce que je ne comprends pas c'est que l’exécution de mon application se bloque à ce niveau là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                ' Wait until a connection is made and processed before continuing.
                allDone.WaitOne()
    L'exécution de mon app ne doit pas être bloquée en attendant une connexion TCP, savez-vous comment je peux faire ?
    Faut-il utiliser des threads, si oui comment faire ? Merci beaucoup

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    quand on trouve un exemple, le but n'est pas de faire un copier coller, mais de le comprendre

    ici c'est un exemple d'une application console donc c'est normal de faire quelque chose de bloquant

    tu peux lire ce topic http://www.developpez.net/forums/d15...a-dialogue-ip/
    c'est du c# mais je viens d'y expliquer le fonctionnement des méthodes asynchrones du tcp (c'est un client dans son exemple mais l'envoi/réception fonctionne de la même manière)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 52
    Points : 31
    Points
    31
    Par défaut
    Merci Polo63 pour ta réponse.
    Oui en effet j'ai fait un copié/collé car je ne maîtrise pas parfaitement le langage
    Par contre j'ai bien vu qu'il s'agissait d'une application console.
    Je jette un coup d’œil à ce que tu m'as envoyé.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 52
    Points : 31
    Points
    31
    Par défaut
    J'ai repris l'exemple complet de la MSDN pour l'intégrer dans une application console mais le problème est le même mon application reste bloquée en attendant une connexion TCP bon normalement en même temps c'est exactement le même code que j'ai repris pour l'appliquer dans une app avec forms.

    J'ai commencé à lire le topic que tu m'as envoyé mais je me perds rapidement

    Ce que j'aimerais faire c'est :

    - Un serveur TCP qui gère plusieurs connexions clients
    - Ce serveur TCP doit s'exécuter sans pour autant bloquer l'exécution de l'application qui gère aussi une liaison série en permanence (cette deuxième partie est fonctionnelle)

    En reprenant l'application MSDN l'exécution de l'application se bloque aussi à l'attente d'une connexion TCP :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    Imports System
    Imports System.Net
    Imports System.Net.Sockets
    Imports System.Text
    Imports System.Threading
    Imports Microsoft.VisualBasic
     
    ' State object for reading client data asynchronously
     
    Public Class StateObject
        ' Client  socket.
        Public workSocket As Socket = Nothing
        ' Size of receive buffer.
        Public Const BufferSize As Integer = 1024
        ' Receive buffer.
        Public buffer(BufferSize) As Byte
        ' Received data string.
        Public sb As New StringBuilder
    End Class 'StateObject
     
     
    Public Class AsynchronousSocketListener
        ' Thread signal.
        Public Shared allDone As New ManualResetEvent(False)
     
        ' This server waits for a connection and then uses  asychronous operations to
        ' accept the connection, get data from the connected client, 
        ' echo that data back to the connected client.
        ' It then disconnects from the client and waits for another client. 
        Public Shared Sub Main()
            ' Data buffer for incoming data.
            Dim bytes() As Byte = New [Byte](1023) {}
     
            ' Establish the local endpoint for the socket.
            Dim ipHostInfo As IPHostEntry = Dns.GetHostEntry(Dns.GetHostName())
            Dim ipAddress As IPAddress = ipHostInfo.AddressList(0)
            Dim localEndPoint As New IPEndPoint(ipAddress.any, 11000)
     
            ' Create a TCP/IP socket.
            Dim listener As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
     
            ' Bind the socket to the local endpoint and listen for incoming connections.
            listener.Bind(localEndPoint)
            listener.Listen(100)
     
            While True
                ' Set the event to nonsignaled state.
                allDone.Reset()
     
                ' Start an asynchronous socket to listen for connections.
                'Console.WriteLine("Waiting for a connection...")
                listener.BeginAccept(New AsyncCallback(AddressOf AcceptCallback), listener)
     
                ' Wait until a connection is made and processed before continuing.
                allDone.WaitOne()
            End While
        End Sub 'Main
     
     
        Public Shared Sub AcceptCallback(ByVal ar As IAsyncResult)
            ' Get the socket that handles the client request.
            Dim listener As Socket = CType(ar.AsyncState, Socket)
            ' End the operation.
            Dim handler As Socket = listener.EndAccept(ar)
     
            ' Create the state object for the async receive.
            Dim state As New StateObject
            state.workSocket = handler
            handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, New AsyncCallback(AddressOf ReadCallback), state)
        End Sub 'AcceptCallback
     
     
        Public Shared Sub ReadCallback(ByVal ar As IAsyncResult)
            Dim content As String = String.Empty
     
            ' Retrieve the state object and the handler socket
            ' from the asynchronous state object.
            Dim state As StateObject = CType(ar.AsyncState, StateObject)
            Dim handler As Socket = state.workSocket
     
            ' Read data from the client socket. 
            Dim bytesRead As Integer = handler.EndReceive(ar)
     
            If bytesRead > 0 Then
                ' There  might be more data, so store the data received so far.
                state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead))
     
                ' Check for end-of-file tag. If it is not there, read 
                ' more data.
                content = state.sb.ToString()
                'If content.IndexOf("<EOF>") > -1 Then
                ' All the data has been read from the 
                ' client. Display it on the console.
                Console.WriteLine("Read {0} bytes from socket. " + vbLf + " Data : {1}", content.Length, content)
                ' Echo the data back to the client.
                Send(handler, content)
                'Else
                ' Not all data received. Get more.
                'handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, New AsyncCallback(AddressOf ReadCallback), state)
                'End If
            End If
        End Sub 'ReadCallback
     
        Private Shared Sub Send(ByVal handler As Socket, ByVal data As String)
            ' Convert the string data to byte data using ASCII encoding.
            Dim byteData As Byte() = Encoding.ASCII.GetBytes(data)
     
            ' Begin sending the data to the remote device.
            handler.BeginSend(byteData, 0, byteData.Length, 0, New AsyncCallback(AddressOf SendCallback), handler)
        End Sub 'Send
     
     
        Private Shared Sub SendCallback(ByVal ar As IAsyncResult)
            ' Retrieve the socket from the state object.
            Dim handler As Socket = CType(ar.AsyncState, Socket)
     
            ' Complete sending the data to the remote device.
            Dim bytesSent As Integer = handler.EndSend(ar)
            Console.WriteLine("Sent {0} bytes to client.", bytesSent)
     
            handler.Shutdown(SocketShutdown.Both)
            handler.Close()
            ' Signal the main thread to continue.
            allDone.Set()
        End Sub 'SendCallback
    End Class 'AsynchronousSocketListener

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    enlève le manualresetevent, il sert à bloquer l'appli


    après débuter sur un langage en commencant par le tcp ce n'est pas la meilleure idée, commence déjà par lire quelques cours
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 52
    Points : 31
    Points
    31
    Par défaut
    Bon j'ai pas mal avancé.
    J'arrive à faire ce que je souhaitais.
    Par contre je ne comprends pas, j'aimerais convertir les données reçues en hexadécimal pour pouvoir les envoyer en RS232, j'ai trouvé l'astuce suivante :

    byteArray = System.Text.ASCIIEncoding.ASCII.GetBytes(content, 0, bytesRead)

    Le problème c'est qu'il convertir un FF envoyé via socket par '63' au lieu de '255', je ne comprends pas pourquoi, tu as une idée ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
        Public Shared Sub ReadCallback(ByVal ar As IAsyncResult)
            'Etape 2
            Dim objet3 As ComRS232 = Nothing
            Dim content As String = String.Empty
            ' Retrieve the state object and the handler socket
            ' from the asynchronous state object.
            Dim state As StateObject = CType(ar.AsyncState, StateObject)
            Dim handler As Socket = state.workSocket
     
            ' Read data from the client socket. 
            Dim bytesRead As Integer = handler.EndReceive(ar)
     
            'Aide
            'byteRead est le nombre d'octets lus
     
            If bytesRead > 0 Then
                ' There  might be more data, so store the data received so far.
                state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead))
     
                ' Check for end-of-file tag. If it is not there, read 
                ' more data.
                content = state.sb.ToString().TrimEnd(New Char() {ChrW(13)})
     
                Dim byteArray(bytesRead) As Byte
                byteArray = System.Text.ASCIIEncoding.ASCII.GetBytes(content, 0, bytesRead)
                'MsgBox(byteArray(0))
                Dim tt As String = ""
     
     
                For i As Integer = 0 To byteArray.Length - 1
                    tt = tt + " " & byteArray(i)
                Next
                MsgBox(tt)
                objet3 = ComRS232.GetInstance
                objet3.Send(byteArray)
     
                Send(handler, content)
     
            End If
     
        End Sub 'ReadCallback

  7. #7
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 52
    Points : 31
    Points
    31
    Par défaut
    Bonjour,

    je reprends ce sujet et j'ai encore un petit soucis.
    Tout à l'air de bien fonctionner cependant lorsque je ferme l'application j'ai toujours le port TCP qui semble rester ouvert, ce qui empêche une fermeture propre de mon application.

    Résultat lorsque j'essaye de relancer mon appli celle-ci génère un message d'erreur car le process précédent est toujours actif

    Vous avez une idée de ce que je dois fermer lors de la fermeture de mon application ?
    Merci.

  8. #8
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    quand on démarre un thread l'application peut en effet rester dans les processus actifs s'il reste des threads en cours

    pour ca avant de faire monthread.start il faut mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monthread.isbackground = true
    ceci fait que quand le thread ayant créé monthread se termine, monthread se termine aussi (un peu violemment certes mais ce n'est pas forcément grave)
    pour du plus propre, c'est à toi d'implémenter l'arret du thread (si c'est une boucle infinie il faut tester un booléen pour sortir de la méthode par exemple)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. Discussion client serveur, socket TCP
    Par darktimide dans le forum Réseau
    Réponses: 3
    Dernier message: 23/12/2012, 21h18
  2. [SOCKET] TCP client/serveur
    Par hxh2008 dans le forum Réseau
    Réponses: 3
    Dernier message: 25/11/2011, 17h01
  3. Socket TCP, serveur C, client PHP
    Par Alastor Nephos dans le forum Réseau
    Réponses: 5
    Dernier message: 31/03/2009, 14h41
  4. Sécuriser serveur multithread utilisant des socket tcp
    Par matthieu637 dans le forum Sécurité
    Réponses: 1
    Dernier message: 16/03/2009, 23h41
  5. Réponses: 2
    Dernier message: 23/10/2006, 13h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo