Une boucle qui s'arette ? ...

Résolu
Signaler
Messages postés
233
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
3 novembre 2011
-
Messages postés
883
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
3 mars 2009
-
Alors voilà, je viens tout juste de migrer en VB.net 2005 donc l'orienté objet c'est relativement nouveau pour moi.
Je me suis mis a analyser une source TCP/IP en mode console et il y a quelque chôse que je ne comprend vraiment pas :
          
While True
                Console.Write("Waiting for a connection... ")
               
                Dim client As TcpClient = server.AcceptTcpClient
                Console.WriteLine("Connected!")
                 ...
                 ...
End While

Pourquoi la boucle s'arette t-elle et attand que la Classe TcpClient soit instancier ... ?

Merci d'avance,
Simon

5 réponses

Messages postés
883
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
3 mars 2009
7
C'est pas sa question jmfmarques, il a bien compris le While True (que j'utiliserais moi aussi dans ce cas soit dit en passant...)...
En fait la commande server.Accept bloque le thread appelant jusqu'à ce qu'une connection lui parvienne.
Pour échapper à cet inconvénient, tu peux soit faire du multithreading manuel, soit utiliser la méthode BeginAccept/EndAccept qui fait du multithreading tout seul. Pour le BeginAccept/EndAccept, tu trouveras des exemples facilement sur google avec ces mêmes mots-clés. Pour le multithreading, tu peux faire facilement comme ceci :

Delegate Sub DelConnectionReceived(client as TcpClient)

Dim ClientList as new list(of TcpClient)
Dim t as Threading.Thread

Sub BeginReceive
    t = new Threading.Thread(addressof ReceiveConnections)
    t.Start()
end sub

Sub EndReceive
   t.Abort()
End Sub

Sub ReceiveConnections()
  While True          'Peut être plus mieux d'utiliser quand même un boolean isRunning      
                Dim client As TcpClient = server.AcceptTcpClient
                 ...  'Vérifie ici que ton client est valide
                 Dim args(0) as Object
                 args(0) = client
                 Invoke(New DelConnectionReceived(Addressof ReceivedAConnection), args)
    End While
End Sub

Sub ReceivedAConnection(client as TcpClient)
     ClientList.Add (client)
     Console.WriteLine("Oh ! Un nouveau client s'est connecté !")
End sub

Ecris à main levée, il y a peut-être des erreurs... mais tu as une idée de ce que tu dois faire...
<hr size="2" width="100%" />Julien.
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
Bp)nkpur,

ceci n'a pas vraoment grand chose à voir avec ta migration !

Quand tu écris
While True, tout seul, sans préciser ce qui doit avoir la valeur True), ta condition est TOUJOURS vraie !While True siginifie yout simplement "tandis que Vrai <gras>Vrai" (et Vrai est toujours</gras> Vrai !)

Essaye et tu verras (que ce soit sous VB6 ou sous VB.Net en trransposant msgbox en ce qui convient sous VB.Net)

Private Sub Command1_Click()
   If True Then MsgBox "vrai"
  If  -1 Then MsgBox "vrai"
  If Not False Then MsgBox "vrai"
  If Not 0 Then MsgBox "vraaai"
  While True
    MsgBox "oui"
  Wend
End Sub
Messages postés
233
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
3 novembre 2011
1
Merci beaucoup pour vos reponses j'ai enfin compris :) ca n'avait effectivement pas grand chôse avoir avec ma migration ... ^^

Encore merci, Simon
Messages postés
467
Date d'inscription
lundi 24 juin 2002
Statut
Membre
Dernière intervention
9 mars 2011

personnelement je t'aurais plus orienté vers les methode non bloquante des controles qui t'evite de devoir manipulé les thread c'est .net qui va s'en occupé ce sont les methode dites "asynchrones" elles se reconnaissent TRES facilment elles portent le même nom que les methode normales mais commence par "Begin" et "End" correspondant
exemple :
Accept => methode bloquante (synchrone)
BeginAccept => lancement de la methode non bloquante (asynchrone)
EndAccept => fin de l'accept asynchrone

elles sont directement exploitable dans la classe "Socket" par exemple
et je pense qu'avec toutes les classe derivé tu peux recuperer le socket sous jacent sous la forme de system.net.socket et donc faire des apelle asynchrone sans pour autant devoir gérer l'encapsulation
cela t'evitera tout les problème de lock, synchro, event, delegué ect ... pour pas par exemple generé des donne "hll werodl" au lieu de "hello world"

TeBeCo
Messages postés
883
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
3 mars 2009
7
Relis mon message, je lui en ai parlé, je lui ai juste indiqué de se documenter lui-même sur le sujet parce qu'il trouverait très facilement des infos avec ces mots-clés là, tandis qu'avec le multi-threading manuel, il aurait eu difficile de tomber sur ce qu'il voulait faire, donc je lui ai fait un exemple c'est tout... Faut pas avoir peur du multi threading manuel surtout dans ce cas-ci. Moi personnellement, j'ai toujours préféré cette méthode aux begin/end accept parce que je vois ce que je fais et j'ai un controle en asynchrone par rapport à mon thread principal qui me permet de vérifier si le client est bon (faire un handshake quoi...), c'est juste une question de gout...

<hr width="100%" size="2" />Julien.