fdiedler2000
Messages postés383Date d'inscriptionsamedi 29 janvier 2005StatutMembreDernière intervention 1 décembre 2008
-
15 mars 2007 à 15:27
fdiedler2000
Messages postés383Date d'inscriptionsamedi 29 janvier 2005StatutMembreDernière intervention 1 décembre 2008
-
17 mars 2007 à 10:34
Bonjour à tous,
Je developpe une application Serveur en multiclient et j'ai vraiment
d'aide pour gerer les telechargements simultanés des clients !
J'utilise des Threads mais un peu n'importe comment ^^ Donc je voudrais
savoir qu'est ce qui est le mieux pour ce type d'application. Je sais
qu'il existe le Thread Pool et le BackGroundWorker mais je sais pas ce
que c'est...
hvb
Messages postés939Date d'inscriptionvendredi 25 octobre 2002StatutMembreDernière intervention27 janvier 20093 15 mars 2007 à 16:24
perso, j'ai écris une classe de gestion de socket (serveur et client) et j'ai opté pour les backgroundworker qui sont tout d'abord simple d'utilisation, mais surtout qui permettent de renvoyer des évenement ne necessitant pas de Invoke ou autre ruse pour faire des accés aux forms de manière "threads-safe"
fdiedler2000
Messages postés383Date d'inscriptionsamedi 29 janvier 2005StatutMembreDernière intervention 1 décembre 2008 15 mars 2007 à 18:13
Salut, merci pour ta réponse
Pourrait tu m'en dire plus sur ta classe et sur ce composant pour les transferts de fichiers ?
Autre chose : Est ce que tu as desbugs de threads lors de l'envoi ou reception d'un fichier voire meme connection / Deco des sockets avec ta classe ?
Pourrait tu egalement me l'envoyer par mail sur fdiedler2000@free.Fr si cela ne te dérange pas...
troxsa
Messages postés553Date d'inscriptionjeudi 28 novembre 2002StatutMembreDernière intervention 2 octobre 20161 16 mars 2007 à 17:04
Ben oui :) mais pour sa il faudrait nous dire ou tu bloque exactement dans ton code :)
D'apres ce que je comprend tu voudrais faire de l'envois de données (Bytes ou Octects) en tache de font (Thread)
Quelle est la class utiliser pour faire ton serveur ?
fdiedler2000
Messages postés383Date d'inscriptionsamedi 29 janvier 2005StatutMembreDernière intervention 1 décembre 2008 16 mars 2007 à 18:18
En fait, en ce moment j'utilise une classe pour d'envoi de ficheir pour chaque client... mais je sais pas si c'est la meilleure solution car parfois quand plusieurs clients téléchargent y'a des bugs que j'arrive pas à trouver...
Voici ma procédure SendFile dans ma classe EnvoyerFichier
Try
cptWhile = 0
Dim InfoFile As New FileInfo(CheminTreeview)
Dim Buffer(Taille) As Byte
MonStreamRead = New FileStream(CheminTreeview, FileMode.Open, FileAccess.Read)
TailleFichier = InfoFile.Length ' taille du fichier
RaiseEvent BeforeTransfert(SonIp, InfoFile.Name) 'Avant le transfert
'Demarre l'envoi
StartTime = Date.Now.Ticks
MonTimer = New Timers.Timer
AddHandler MonTimer.Elapsed, AddressOf Elapsed
With MonTimer
.Interval = 1000
.Enabled = True
.Start()
End With
'envoi les données
While Not cptWhile = MonStreamRead.Length \ Taille
cptWhile += 1
MonStreamRead.BeginRead(Buffer, 0, Taille, AddressOf Read, MonStreamRead)
SocketFichier.Send(CurrentSocketClient, Buffer, Taille)
End While
'envoi le reste des données
Dim rest As Integer = CInt(MonStreamRead.Length - (cptWhile * Taille))
If rest > 0 Then
'MsgBox("fin send")
Buffer = New Byte(rest) {}
MonStreamRead.BeginRead(Buffer, 0, rest, AddressOf Read, MonStreamRead)
SocketFichier.Send(CurrentSocketClient, Buffer, rest)
Ligne.SubItems(3).Text = "100 %"
End If
RaiseEvent AfterTransfert(SonIp) 'Apres le transfert
'Libere la memoire
MonStreamRead.Close()
MonStreamRead = Nothing
With MonTimer
.Stop()
.Enabled = False
.Dispose()
End With
MonTimer = Nothing
GC.Collect()
Catch a As ArgumentException
StopUrgence()
Exit Sub
Catch ex As IOException
' MsgBox("Impossible d'envoyer le fichier. Erreur : " + ex.Message, MsgBoxStyle.Critical)
End Try
End Sub
troxsa
Messages postés553Date d'inscriptionjeudi 28 novembre 2002StatutMembreDernière intervention 2 octobre 20161 16 mars 2007 à 20:34
Vu ton code comme ça je comprend que chaque client connecter passe par cette routine (procedure) et en gros c'est cette routine (procedure) qu'il faut mettre dans un Thread ?
A premier vu je vois pas ou est le probleme ton code est relativement bon malgré ... de petit bout qui sers a rien :)
Avec le framework rien ne sers a detruire les object ou de vider les object le framework le gere tres bien, le Gabage Collecor sers a forcer la liberation de mémoire de plus il est deconseiler d'utiliser ce genre de methode avec le GC (gabage Collector) source Microsoft et MSDN sous peine de plantage !
Je vois que tu utilise un ListWiew (Ligne.SubItems(3).Text = "100 %") c'est peut etre la que ça plante non ?
Pourrais peut etre me donner plus d'information sur ton plantage vu comme ça c'est un peux dur de trouver
fdiedler2000
Messages postés383Date d'inscriptionsamedi 29 janvier 2005StatutMembreDernière intervention 1 décembre 2008 16 mars 2007 à 21:15
en fait le probleme c'est que c'est aléatoire et ca dépends des jours lool c'est ca le pire...
Impossible de le localiser et oui je me demandais si c'était pas la listview qui plantait ^^ mais d'après l'interface graphique de mon serveur, chaque avancement des telechargement de chaque client était correct !
Je remet en cause le fait de passer par une classe pour l'envoi d'un fichier à un client spécifique. N'y a t-il pas un autre moyen ?
De plus, quelle est la différence entre Read et BeginRead pour le Stream ? je suis passer en synchrome car en asynchrome ca plantait !
De plus, j'envois les bytes du fichier en synchrome car je n'ai pas fait de vérification des bytes envoyés par le client et donc en asynchrome ca plante !
Voila, enfin je pense que c'est mal gérer et je me demande si c'est un problme de Thread ou autre !
troxsa
Messages postés553Date d'inscriptionjeudi 28 novembre 2002StatutMembreDernière intervention 2 octobre 20161 16 mars 2007 à 22:58
Il me semble avoir deja vu sa qu'elle que par (exemple de sockets)!
je vais rechercher ça mais je crois bien que c'est en version US
Sa te derange si tu me file les sources histoire que je jete un oeil ?
au cas ou mon mail troxsa__gmail__com (remplace "__" par "@" ou ".")
Mais pas ce soir hien ! :) la je file me coucher