salut a tous
tout d'abord je vous rassure je me suis renseigne sur le net avant de venir, en regardant la faq les tuto et surtout le forum de long en large mais je n'ai pas trouvé de réponse satisfaisante et pour un info je suis débutant en vb même si je fais de la programmation pour mes études ce petit aparté c juste pour que vous compreniez mieux ma demande
je fais un tchat pour valider un des 5 projets que je dois faire pour mon bts ici il s'agit du client/serveur
en gros j'ai commence un tchat façon msn dont le programme fais le client et le serveur selon le cas
Fonctionnement:
quand l'utilisateur1 double clic dans la liste d'ip ça ouvre une nouvelle form de type dialogue qui essaye de se connecte a l'ip sélectionné sur le port 3000
sur le pc de l'ip sélectionné donc l'utilisateur2 (si le logiciel est en marche chez lui évidement) la form principal intitulé menu accepte cette connection elle ouvre une nouvelle form de type dialogue qui se met en mode écoute sur le port 300
le winsock du menu envoie une chaîne (/co) à l'utilisateur1 en lui demandant de se deco du port 3000 et essayer de se connecter sur le port 300
hop la connection est établie et le menu se remet en mode écoute
donc je vous donne le code pour que vous compreniez mieux
LA FORM PRINCIPAL MENU
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
62
63
64 Dim Frm As Dialogue Dim Frm2 As Dialogue Public nb_contact As Integer Private Sub Ajout_Click(Index As Integer) Ajout_Form.Show End Sub Private Sub Form_Load() 'au chargement on met le serveur en mode ecoute et on initialise le nbr de contact nb_contact = 0 pseudo = txtPseudo.Text WServeur.Listen lstAmis.AddItem "192.168.0.3" ' mes ip de test lstAmis.AddItem "192.168.0.1" End Sub Private Sub Form_Unload(Cancel As Integer) 'quand on quitte avec la croix End End Sub Private Sub lstAmis_DblClick() 'quand on double clic sur une ip de la liste ca ouvre la fenetre discussion Set Frm2 = New Dialogue Frm2.testip = lstAmis.Text Frm2.Show End Sub Private Sub Quitter_Click() 'quand on quitte par le menu End End Sub Private Sub txtPseudo_Change() If txtPseudo.Text = "" Then MsgBox ("Le pseudo doit être défini.") txtPseudo.Text = "Pseudo" Else pseudo = txtPseudo.Text End If End Sub Private Sub WServeur_ConnectionRequest(ByVal requestID As Long) 'quand on recoit une demande de connection ca ouvre une nouvelle fenetre de type dialogue 'cette fenetre jouera role du serveur et on donne l'ordre au client de demander de se connecter ' a celle ci grace a la chaine /co Set Frm = New Dialogue Frm.Show WServeur.Close WServeur.Accept (requestID) ' On Error Resume Next WServeur.SendData ("/co") End Sub Private Sub WServeur_DataArrival(ByVal bytesTotal As Long) Dim t As String On Error Resume Next WServeur.GetData t MsgBox (t) End Sub Private Sub WServeur_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean) MsgBox "Menu : Erreur n°" & Number & " -- " & Description, vbInformation End Sub
LA FORM DIALOGUE
il ya aussi la form pour ajouter des ip et un module qui comptient la variable pseudo mais cela ne rentre pas en compte pour mon probleme
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131 Public testip As String Dim testconnect As Integer Private Sub btnEnvoyer_Click() 'si le message n'est pas vide on le copie dans la fenetre de discussion ... If txtMessage.Text <> "" Then txtDiscussion.Text = txtDiscussion.Text & pseudo & " a dit: " & vbNewLine txtDiscussion.Text = txtDiscussion.Text & txtMessage.Text & vbNewLine '... puis on l'envoie au correspondant On Error Resume Next Wclient.SendData (pseudo & " a dit:" & vbNewLine & txtMessage.Text) ' et on efface l'ancien message txtMessage.Text = "" End If End Sub Private Sub btnPolice_Click() 'boite police pour le message CD1.Flags = cdlCFBoth CD1.ShowFont If CD1.FontName <> Null And CD1.FontName <> "" Then txtMessage.FontName = CD1.FontName End If txtMessage.FontSize = CD1.FontSize txtMessage.FontItalic = CD1.FontItalic txtMessage.FontBold = CD1.FontBold End Sub Private Sub Form_Load() Dim data2 As String testconnect = 0 'on test si une conversation n'est pas deja en route si c'est le cas on essaye de se connecter If testip <> "" And testconnect = 0 Then Wclient.Close Wclient.RemoteHost = Wclient.LocalIP Wclient.RemotePort = 300 Wclient.LocalPort = 0 Wclient.Connect testip, 300 lbltitre.Caption = "client" On Error Resume Next DoEvents Wclient.GetData data2 If data2 = "/confirmco" Then testconnect = 1 MsgBox ("connection rétablie") End If End If 'si testip contient une ip on se met en mode client sinon en serveur If testip <> "" And testconnect = 0 Then Wclient.Close Wclient.RemoteHost = Wclient.LocalIP Wclient.RemotePort = 3000 Wclient.LocalPort = 0 Wclient.Connect testip, 3000 lbltitre.Caption = "client" ElseIf testconnect = 0 Then Wclient.Close lbltitre.Caption = "serveur" Wclient.LocalPort = 300 Wclient.RemotePort = 0 Wclient.RemoteHost = 0 Wclient.Listen End If End Sub Private Sub Form_Unload(Cancel As Integer) 'quand on ferme la fenetre on se deco et on envoi une confirmation au correspondant On Error Resume Next Wclient.SendData "/deco" DoEvents Wclient.Close Wclient.LocalPort = 0 End Sub Private Sub WClient_ConnectionRequest(ByVal requestID As Long) 'on accepte que le client se connecte au serveur Wclient.Close Wclient.Accept (requestID) Wclient.SendData "/confirmco" End Sub Private Sub WClient_DataArrival(ByVal bytesTotal As Long) Dim data As String On Error Resume Next Wclient.GetData data If data = "/co" Then 'le serveur du menu a accepte la connection et demande de se reconnecte sur le port 300 Wclient.Close Wclient.RemoteHost = Wclient.LocalIP Wclient.RemotePort = 300 Wclient.LocalPort = 0 Wclient.Connect testip, 300 'comme le client et le serveur sont relie on reactive le serveur du menu en mode ecoute Menu.WServeur.Close Menu.WServeur.Listen ElseIf data = "/deco" Then 'votre correspondant vous previent qu'il s'est deconnecte donc vous ferme 'la liason et vous l'affichez Wclient.Close Wclient.LocalPort = 0 'si vous etiez serveur vous vous mettez a réecouter If lbltitre.Caption = "serveur" Then Wclient.Listen MsgBox Wclient.State Else 'sinon ovus devenez serveur et vous ecoutez Wclient.Close lbltitre.Caption = "serveur" Wclient.LocalPort = 300 Wclient.RemotePort = 0 Wclient.RemoteHost = 0 Wclient.Listen End If txtDiscussion.Text = txtDiscussion.Text & "Votre correspondant est deconnecté" & vbNewLine Else txtDiscussion.Text = txtDiscussion.Text & data & vbNewLine End If End Sub Private Sub WClient_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean) MsgBox lbltitre.Caption & " :Erreur n°" & Number & " -- " & Description, vbInformation End Sub
alors mon probleme c'est que quand on ferme une fenetre de dialogue je ne sais pas si l'envoie de "/deco" bug ou si c'est la reception qui bug mais l'autre correspondant n'est pas prevenu
mon deuxieme est lié je pense c'est que je n'arrive pas a me reconnecte une deuxieme fois mais par compte si user1 lance une conversation avec user2 ca marche s'il retente (apres que les 2 users aient fermés leurs fenetre) ca marche pas et autant de fois qu'il tentera
puis si l'user2 lance une conversation la ca marchera puis si l'user1 lance apres ca marchera en gros ca marche si les discussions sont lances chacun leurs tours en alternance
si vous pouviez m'aider ce serais super je demande pas la solution mais un petit indice qui me mettrai sur la voix
sinon j'ai deja vu
dans unload
Code : Sélectionner tout - Visualiser dans une fenêtre à part Set Nomdelaform = Nothing
mais je ne sais pas a quoi ca correspond
sinon pour ceux qu'ils veulent les sources vb avec les form etc enfin le tout faut aller ici
Partager