Mets nous ton code complet la ou tu en es pour le moment stp.
Mets nous ton code complet la ou tu en es pour le moment stp.
Alors OhMonBato, pour te répondre, c'est une sorte d'exercice que je fais là pour apprendre à manier ce controle.
Si je voulais par exemple faire un Chat, j'utliserai des RichtextBox et je diviserai les données de tel sorte à toutes les afficher, apres je me debrouillerai avec ce que je sais quoi...
Mais là c'est vraiment pour exploiter ce controle, et appendre à m'en servir et découvrir toutes ses fonctionnalité, donc je n'ai pas de but précis dans la réalisation pour l'instant, là mon but était de pouvoir récupérer un text qu'a écrit un client, et que ça se fasse instantanément, ca m'a permis de découvrir comment ça fonctionne, le code de début et de fin etc...
Merci pour vos réponses ! =D
Alors pour le server :
Pour le client :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 Private intMax As Long Private Sub Form_Load() intMax = 0 tcpServer(0).LocalPort = 1001 tcpServer(0).Listen ' Donne à la propriété LocalPort une valeur ' entière. Puis invoque la méthode Listen. 'tcpServer.LocalPort = 1001 'tcpServer.Listen ' Affiche la feuille client. 'frmClient.Show End Sub Private Sub Timer1_Timer() Label1.Caption = tcpServer(intMax) End Sub Private Sub txtSendData_Change() ' Le contrôle TextBox nommé txtSendData contient ' les données à envoyer. Chaque fois que l'utilisateur entre du ' texte dans le contrôle textbox, la chaîne est envoyée en ' utilisant la méthode SendData. tcpServer(intMax).SendData txtSendData.Text End Sub Private Sub tcpServer_DataArrival _ (Index As Integer, ByVal bytesTotal As Long) ' Déclare une variable pour les données reçues. ' Invoque la méthode GetData et paramètre pour ' ces données la propriété Text d'un contrôle ' TextBox nommé txtOutput. Dim strData As String 'tcpServer(intMax).GetData strData tcpServer(Index).GetData strData txtOutput.Text = strData End Sub Private Sub tcpServer_ConnectionRequest _ (Index As Integer, ByVal requestID As Long) If Index = 0 Then intMax = intMax + 1 Load tcpServer(intMax) tcpServer(intMax).LocalPort = 0 tcpServer(intMax).Accept requestID 'Load txtData(intMax) End If ' Vérifie que le contrôle est fermé. Sinon, ferme ' la connexion en cours avant d'accepter la ' nouvelle. 'If tcpServer.State <> sckClosed Then _ 'tcpServer.Close ' Accepte la demande avec le paramètre requestID. 'tcpServer.Accept requestID End Sub
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 Private Sub Command1_Click() MsgBox tcpClient.State End Sub Private Sub Command2_Click() Me.txtSend.Refresh Me.txtOutput.Refresh End Sub Private Sub Form_Load() ' Le nom du contrôle Winsock est tcpClient. ' Note : pour spécifier un hôte distant, vous pouvez utiliser soit ' l'adresse IP (ex: "121.111.1.1"), soit le nom complet de ' l'ordinateur, comme ci-dessous. tcpClient.RemoteHost = "MON IP" tcpClient.RemotePort = 1001 End Sub Private Sub cmdConnect_Click() ' Invoque la méthode Connect pour établir une ' connexion. Label1.Caption = "connexion en cours..." tcpClient.Connect Timer1.Enabled = True End Sub Private Sub txtSend_Change() tcpClient.SendData txtSend.Text End Sub Private Sub tcpClient_DataArrival _ (ByVal bytesTotal As Long) Dim strData As String tcpClient.GetData strData txtOutput.Text = strData End Sub Private Sub Timer1_Timer() If tcpClient.State = "7" Then Label1.Caption = "connexion réussie" Timer1.Enabled = False Else Label1.Caption = "connexion échouée" Timer1.Enabled = False End If End Sub
Par contre j'aimerai que quand un client ecrive quelque que chose, que ça s'affiche sur le serveur evidemment (ca le fait), mais aussi dans le text2 de tous les autres clients connectés.
J'ai essayé le code suivant dans le client, mais quand je clique sur mon bouton pour se connecter, ca me dit : "opération non valide à ce stade" concernant.
Code : Sélectionner tout - Visualiser dans une fenêtre à part tcpClient(0).Connect
Voici mon code retouché donc pour faire ce que j'ai dit précédemment concernant le client :
Les noms de mes textbox sont respectivement txtSend et txtOutput.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 Private intMax As Long Private Sub Form_Load() intMax = 0 ' Le nom du contrôle Winsock est tcpClient. ' Note : pour spécifier un hôte distant, vous pouvez utiliser soit ' l'adresse IP (ex: "121.111.1.1"), soit le nom complet de ' l'ordinateur, comme ci-dessous. tcpClient(0).RemoteHost = "MON IP" tcpClient(0).RemotePort = 1001 tcpClient(0).Listen End Sub Private Sub cmdConnect_Click() ' Invoque la méthode Connect pour établir une ' connexion. Label1.Caption = "connexion en cours..." tcpClient(0).Connect Timer1.Enabled = True End Sub Private Sub txtSend_Change() tcpClient(intMax).SendData txtSend.Text End Sub Private Sub tcpClient_DataArrival _ (Index As Integer, ByVal bytesTotal As Long) Dim strData As String tcpClient(Index).GetData strData txtOutput.Text = strData End Sub Private Sub Timer1_Timer() If tcpClient.State = "7" Then Label1.Caption = "connexion réussie" Timer1.Enabled = False Else Label1.Caption = "connexion échouée" Timer1.Enabled = False End If End Sub
Voilà qu'est ce qui cloche ? =o
Merci d'avance =)
non, tu n'as qu'un seul contrôle WinSock par client. ,
utilise le serveur pour retransmettre en echo les messages reçu vers tous les autres client.
Ah daccord, ya une fonction echo déjà crée ? Ou bien j'ai juste à refaire ce que jviens de faire avec les textbox mais par exemple sous forme de log dans un richtextbox ?
nan je ne pense pas qu'il y est de fonction echo, mais dans serveur tu peu faire suivre tous les messages reçus aux autres clients..
Je crois avoir compris, j'ai testé un petit truc et j'ai l'impression que ça marche...
J'ai rajouté sur le server et le client un richtextbox qui sert de log des données envoyées.
Sur le server j'ai mis :
et sur le client j'ai mis :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Private Sub txtOutput_Change() txt.Text = txt.Text & vbCrLf & txtOutput tcpServer(intMax).SendData txtOutput.Text End Sub
Ca doit etre ça non ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Private Sub txtOutput_Change() txt.Text = txt.Text & vbCrLf & txtOutput.Text End Sub
Sachant que pour envoyer des données via le client, j'ai rajouté un commandbutton vu que j'utilise la fonction "change" pour pas mal de trucs, ca aurait fait envoyé chaque caractère tappé au lieu de la "chaîne de données" si je puis dire.
[edit] : Aaaah non, quand je lance 2 clients, si avec le 2eme client par exemple j'ecris un truc, le premier client de le reçoit pas >.< ca doit etre juste une petite erreur, jregarde ça...
Tout compte fait, jviens de me rendre compte que ca ne marche qu'entre 1 seul client et le server ='''(((
Où est le probleme silvouplait ?
Il me semble (a verifier) que tu ne peux avoir qu'un seul client par machine si tous les clients utilisent le meme port.
Ben enfaite j'ai deux pc (ils sont sur le même réseau), et j'ai d'abord testé, 2 clients sur un même pc ==> Marche pas
et ensuite, le serveur sur un pc + 1 client et 1 client sur l'autre pc ==> marche pas.
Quand je dis "marche pas", c'est que la connexion n'arrive pas à accepter + d'un client sur le serveur... =(
Je dois etre assez maniaque car j'ai du mal a m'y retrouver avec les TxtSend et TxtOut et le reste J'ai donc prefere faire un petit essai perso.
Ca ne fonctionne pas competement s'il y a 2 clients sur la meme machine, mais si il y a plusieurs machines, pas de soucis a priori (j'ai peut etre oublie de coder l'envoi depuis le serveur avec le bouton de commande mais c'est un detail).
Pas de gestion non plus de deconnexion de client, ce sera a prevoir aussi pourtant.
En esperant que ca puisse t'aider.
Je te remerci d'avoir pris la peine, et de ton temps pour avoir développé ça.
Ca marche impec entre les clients, donc bravo et merci encore !
Donc selon toi, c'était quoi le truc qui clochait dans mon code ?
Jvais comparer les deux, voir comment tu as fait, et je vais essayer de trouver la réponse aussi.
Merci encore =)
Dac jcrois avoir pigé ce qui me manquait...
C'est cette partie :
que j'ai adapté à mon appli' =)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 Dim strData As String Dim i As Byte tcpServer(Index).GetData strData txtOutput(Index).Caption = strData 'On renvoit vers les autres clients, sauf a celui qui a envoye For i = 1 To NbClient If i <> Index Then tcpServer(i).SendData strData End If Next i
Donc si je comprends bien c'était quoi, une confusion pour l'echange des données avec le server ? Le fait que le nombre de clients connectés se définisse mal ?
A partir de ça, comment dois-je m'y prendre pour envoyer des données à partir du serveur ?
Et plus precis encore, pour envoyer 2 données par exemples des coordonnées XY ou autre ?
A partir de ça, comment dois-je m'y prendre pour envoyer des données à partir du serveur ?
Excuse moi mais soit tu as VRAIMENT compris le code donne jusqu'ici et dans ce cas, je ne vois pas trop ou est le probleme pour envoyer quoique ce soit du serveur, soit il faut que tu relises mieux ton code ou le mien pour bien comprendre le mecanisme. Ce n'est pas mechant ce que je te dis la mais tu comprends bien que jusqu'ici, il ne s'agit que d'un tout petit programme qui utilise les bases du protocole TCP/IP. Si tu ne maitrises pas bien a ce niveau, ca va devenir de plus en plus complique pour avancer dans ton projet final qui me semble "assez" ambitieux.
Pour reprendre le code de mon projet, pour envoyer depuis le serveur il suffit d'ajouter :
Si on voulait envoyer un couple de coordonnees X/Y, en partant du principe que chaque coordonnees serait entree dans un textbox, il suffit de faire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Private Sub CmdSend_Click() Wsk(0).SendData TxtOut.Text End Sub
Ce n'est pas tant la difficulte d'envoyer plusieurs donnees que le "protocole" que tu comptes definir entre ton serveur et tes clients qui pourrait demander du boulot. Si tu envois des donnees X/Y par exemple, il va falloir ajouter a ton message un identifiant pour dire qui l'envoit. Si tu comptes envoyer d'autres donnees qui pourraient ressembler a des coordonnees X/Y mais sans en etre, il va aussi falloir ajouter qulequechose a l'envoi de tes donnees pour dire de quel type de donnees il s'agit, etc...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Dim ChX as string dim ChY as string ChX = TxtCoordX.Text ChY = TxtCoordY.Text Wsk(0).SendData ChX & "," & ChY & VbCrLf
Merci pour ta réponse, donc pour les coordonnées je crois avec compris, je testerai ça =)
Pour l'envoi du server, enfaite j'avais déjà fait pas mal d'essais, mais je ne comprend pas ce qui cloche, j'ai mis ce code :txtSendData.text est le textbox1 du server
Code : Sélectionner tout - Visualiser dans une fenêtre à part tcpServer(0).SendData Me.txtSendData.Text
Mais je vois que toi tu as choisi le 2eme, là où les données s'affichent, mais je ne comprend pas pourquoi étant donné que c'est ici que s'est affichée techniquement a derniere données qui est différentes de celle-ci non ?
Merci d'avance
[edit] : Et avec ce que tu m'as donné pour envoyer avec le server, j'obtiens une erreur comme quoi l'etat de connexion ou de protocole est erroné pour la transaction ou la requête requise...=/
[edit2] : J'ai aussi essayé de plusieurs façon d'envoyer sur le server même, et de récupérer pour renvoyer sur les clients des données, mais pareil, erreur...
Exact pour l'erreur, il ne faut pas utiliser Wsk(0) mais chaque controle Wsk qui est connecte a un client, donc comme la boucle de transfert que j'avais mis en cas de reception de donnees sur le serveur.
donc?
Code : Sélectionner tout - Visualiser dans une fenêtre à part tcpServer(Nbclient).SendData Me.txtSendData.Text
J'avais déjà essayé ça aussi, mais Nbclient en prend en compte apparemment que le dernier client qui s'est connecté, ca ne l'envoi qu'à lui...
Donc j'avais essayé d'ajouter et de réadapter ce bout de code :
Mais je n'ai pas réussi à faire fonctionner pour tous les clients...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 For i = 1 To NbClient tcpServer(i).SendData strData Next i
Je precise que la variable i est déclarée généralement, donc peut etre que ça fait une confusion ?
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager