Server MultiClient .Net [Résolu]

Signaler
Messages postés
158
Date d'inscription
dimanche 18 avril 2004
Statut
Membre
Dernière intervention
25 juillet 2018
-
NHenry
Messages postés
14621
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
24 janvier 2020
-
Bonjour, je reviens du langage python et ça fait longtemps que je n'est pas fait du VB.NET

J'essai de faire un server multi client en .NET puis je le test avec un client en python :

Je ne sais pas si c'est bien de faire ainsi mais voici le début de mon serveur, Le problème est que des que le client se connecte et envoi un message, le programme se ferme sans même de message d'erreur :

Imports System.Text
Imports System.Net
Imports System.Net.Sockets


Public Class Form1
    Public Sck As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
    Public Connexion As New List(Of Socket)
    Public buff(1024) As Byte

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Sck.Bind(New IPEndPoint(IPAddress.Parse("192.168.0.4"), 256))
        Sck.Listen(1)
        CreationSocket()
    End Sub

    Private Sub CreationSocket()
        Connexion.Add(Sck)
        Connexion(Connexion.Count - 1).BeginAccept(AddressOf AccepteConnexion, Sck)
    End Sub

    Private Sub AccepteConnexion(ByVal asyncResult As IAsyncResult)
        Connexion(Connexion.Count - 1) = Connexion(Connexion.Count - 1).EndAccept(asyncResult)
        CreationSocket()
    End Sub

    Private Sub MessageRecu(ByVal asyncResult As IAsyncResult)
        For i As Integer = 0 To Connexion.Count
            Dim recu As Integer = Connexion(i).EndReceive(asyncResult)
            If recu <> "" Then
                Chat.Text = Chat.Text & vbCrLf & Encoding.ASCII.GetString(buff)
            End If
        Next i
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Try
            For i As Integer = 0 To Connexion.Count
                Connexion(i).BeginReceive(buff, 0, buff.Length, SocketFlags.None, AddressOf MessageRecu, Connexion(i))
            Next i
        Catch
        End Try
    End Sub

End Class


Une personne a une idée ?

Pareil si je veut informé en inscrivant dans le textbox "Chat" VB.net me parle de Thread (je sais se que c'est) et ne veut rien inscrire...

7 réponses

Messages postés
14621
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
24 janvier 2020
138
Bonjour,

Je comprend ta remarque, après, il y a aussi pas mal de possibilité qui découle de cette implémentation.

Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Messages postés
14621
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
24 janvier 2020
138
Bonjour,

Dans la mesure du possible, faire une classe pour les clients ainsi qu'un classe pour l'écouteur te permet de faciliter la gestion des sockets.

En plus, en utilisant les threads, tu pourra avoir des écoutes bloquantes, plus faciles à gérer.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Messages postés
158
Date d'inscription
dimanche 18 avril 2004
Statut
Membre
Dernière intervention
25 juillet 2018
3
bonjour, si je comprend bien t'as solution, c'est parce que j'ai qu'une seul class que l'appli se ferme une fois la dernière fonction appelé ?

Mais je croyais que la GUI maintenant le programme ouvert ?
Messages postés
158
Date d'inscription
dimanche 18 avril 2004
Statut
Membre
Dernière intervention
25 juillet 2018
3
Mouarf, même avec une autre class l'appli se ferme....

Je pense utiliser Winsock du coup -_-'
Messages postés
14621
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
24 janvier 2020
138
Bonjour,

As-tu essayé en pas à pas ?
Je ne vois pas d'instruction de fermeture de la form, le comportement est donc étrange.

Regardes aussi :
http://www.vbfrance.com/code.aspx?ID=36083

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Messages postés
158
Date d'inscription
dimanche 18 avril 2004
Statut
Membre
Dernière intervention
25 juillet 2018
3
Je vais matter la source et reprendre mon code pas a pas en envoyant des Msgbox pour voir comment sa se passe psq...
Messages postés
158
Date d'inscription
dimanche 18 avril 2004
Statut
Membre
Dernière intervention
25 juillet 2018
3
Bon bah du coup j'ai complètement changé de méthode j'utilise TCPClient et TCPListen (je savais pas que ça existé)

C'est plus simple mais je suis quand même un peut déçu du côté "démerde toi" au niveau des données reçus et à envoyer :

                Dim Stream As NetworkStream = LstClient(i).GetStream
                Dim bytes(LstClient(i).ReceiveBufferSize) As Byte
                Dim Numbytes As Integer = Stream.Read(bytes, 0, CInt(LstClient(i).ReceiveBufferSize))
                Dim Recu As String = Encoding.ASCII.GetString(bytes, 0, Numbytes)


Tous ça pour recevoir un "flux" de données.

Comme dit plus haut je reviens de python est en python :

Recu Sck.recv(1024) et voila c'est fini)