The Meteorologist
Messages postés232Date d'inscriptionjeudi 18 janvier 2007StatutMembreDernière intervention 3 novembre 2011
-
16 juin 2007 à 02:05
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDerniè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 ... ?
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 20097 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.
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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
TeBeCo
Messages postés467Date d'inscriptionlundi 24 juin 2002StatutMembreDerniè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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 20097 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...