Une boucle qui s'arette ? ...

Résolu
The Meteorologist Messages postés 232 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 3 novembre 2011 - 16 juin 2007 à 02:05
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 - 18 juin 2007 à 22:05
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

Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
16 juin 2007 à 09:45
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.
3
jmfmarques Messages postés 7668 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 28
16 juin 2007 à 07:28
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
0
The Meteorologist Messages postés 232 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 3 novembre 2011 1
16 juin 2007 à 13:54
Merci beaucoup pour vos reponses j'ai enfin compris :) ca n'avait effectivement pas grand chôse avoir avec ma migration ... ^^

Encore merci, Simon
0
TeBeCo Messages postés 467 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 9 mars 2011
18 juin 2007 à 21:52
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
18 juin 2007 à 22:05
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.
0