Difficultés connexion socket

KaNaRette Messages postés 7 Date d'inscription dimanche 4 avril 2010 Statut Membre Dernière intervention 13 avril 2010 - 10 avril 2010 à 20:19
KaNaRette Messages postés 7 Date d'inscription dimanche 4 avril 2010 Statut Membre Dernière intervention 13 avril 2010 - 13 avril 2010 à 01:53
Bonjour tout le monde,

Je viens quérir votre aide, car je n'arrive absolument pas à me servir des sockets (j'en ai besoin pour réaliser un jeu d'échecs en réseau).

Donc pour comprendre le principe, je me suis aidé de pas mal de sites là-dessus, mais la plupart sont trop vagues et les codes source que je trouve sont illisibles car ce que je recherche est noyé dans le reste du code.

J'ai donc créé une mini-application de tests, et j'ai le code que voici :

'tentative de connexion
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Try
            If _socket.Connected Then ' si on était déjà connecté quelque part, on se déco
                _socket.Disconnect(True)
            End If

            If radio_loc.Checked = True Then    ' si on a choisi une ip locale
                _socket.Connect(ComboBox1.Text, TextBox3.Text)
            Else                                ' sinon, une ip manuelle
                _socket.Connect(TextBox1.Text, TextBox2.Text)
            End If
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

Les IP locales apparaissent bel et bien dans la combobox, et les ip manuelles ne marchent pas non plus, quelle qu'elles soient.
L'erreur de la messagebox est "Aucune connexion n'a pu être établie car l'ordinateur l'a expressément refusée :", et ce même avec une IP locale avec le pare-feu désactivé.

Donc voilà, j'espère que quelqu'un saura m'aider, et je l'en remercie d'avance car je nage dans le flou là :(

PS : j'utilise VB 2005 Express Edition, si ça change quelque chose.

12 réponses

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
10 avril 2010 à 21:27
Bonjour,

C'est que en face, le port n'est pas ouvert ou que l'application n'accepte pas la connexion.

Mon site
0
KaNaRette Messages postés 7 Date d'inscription dimanche 4 avril 2010 Statut Membre Dernière intervention 13 avril 2010
10 avril 2010 à 21:43
Tout d'abord, merci pour ta réponse rapide.

Comment je peux ouvrir le port ? Ou bien il y a des ports déjà ouverts que je peux utiliser ? (je tape généralement le port 80)
Et est-ce que je suis obligé d'avoir une application en face pour accepter la connexion ?

Merci d'avance
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
10 avril 2010 à 22:07
Bonjour,

Pour ouvrir un port, il y à 2 programmes, le serveur et le client, si tu n'a pas de serveur TCP, ton client ne pourra pas se connecter.

Recherche un code pour faire un serveur TCP.

Mon site
0
KaNaRette Messages postés 7 Date d'inscription dimanche 4 avril 2010 Statut Membre Dernière intervention 13 avril 2010
10 avril 2010 à 23:04
Et ce n'est pas possible de faire une application sans serveur et directement par IP ?

Et sinon, à quoi doit ressembler l'application côté serveur ? J'imagine que je dois créer une socket puis m'y connecter depuis les clients, mais comment en récupérer l'IP et le port correspondant ?

Encore merci de m'accorder ton temps ;)
0

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

Posez votre question
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
10 avril 2010 à 23:23
Bonjour,

Quelques sites :
http://www.eggheadcafe.com/articles/20020323.asp
http://www.codeproject.com/KB/IP/dotnettcp.aspx
Et d'autres :
http://www.google.fr/#hl=fr&source=hp&q=VB.NET+serveur+TCP&meta=&aq=f&aqi=&aql=&oq=&gs_rfai=&fp=87ab027215766c54

Sinon, oui, il est possible de faire un programme qui communique en réseau sans serveur, mais pour cela tournes-toi vers UDP.

Mon site
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
11 avril 2010 à 02:01
Eh, les gars : est-ce que ça vous arrive de faire un tout petit peu de recherche avant de poser ce genre de question ?
Tapez simplement "socket" ou "chat" parmi les codes en .Net et vous aurez des exemples !

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
KaNaRette Messages postés 7 Date d'inscription dimanche 4 avril 2010 Statut Membre Dernière intervention 13 avril 2010
11 avril 2010 à 10:06
Sauf que chercher je fais que ça, et que je cite :
Donc pour comprendre le principe, je me suis aidé de pas mal de sites là-dessus, mais la plupart sont trop vagues et les codes source que je trouve sont illisibles car ce que je recherche est noyé dans le reste du code.
Donc merci au lieu de me rediriger vers Google et faisant le malin tu ferai mieux de te demander _pourquoi_ j'ai demandé de l'aide.

(merci encore NHenry, je commence à comprendre le principe, je reposterai ici si j'y arrive toujours pas ;) )
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
11 avril 2010 à 13:58
Je ne fais pas le malin (et je ne te redirige pas sur google), je t'explique juste que les réponses existent déjà sur le site, au travers des sources présentes et qu'il te suffit de faire une simple recherche.

"ce que je recherche est noyé dans le reste du code" Si tu sais déjà ce que tu recherches dans le code, tu n'as qu'à faire un Ctrl-F !
0
KaNaRette Messages postés 7 Date d'inscription dimanche 4 avril 2010 Statut Membre Dernière intervention 13 avril 2010
12 avril 2010 à 16:10
Bonjour,

J'ai un nouveau problème, et j'espère que quelqu'un saura m'aider.
J'ai réussi à faire marcher mon jeu d'échecs en réseau, seulement au bout du 3e coup (soit à partir 2e coup de chaque joueur), je n'arrive plus à communiquer avec le serveur.
En effet, j'arrive bel et bien à lui envoyer des informations, mais je n'arrive pas à lire celles qu'il m'envoie, bizarrement seulement à partir du 3e coup, surtout que j'avais déjà réalisé plus de communication lors des demandes de pseudos.
J'ai tout essayé (enfin non, mais j'ai essayé tout ce qui me passait par la tête), mais malgré tout impossible de lire le flux, il me renvoie constamment une chaine vide.

Quelqu'un aurait une idée en tête ?

Si ça peut vous être utile, j'utilise ces deux routines pour lire et écrire sur les flux :

    Private Function lecture_flux(ByVal tcpcl As TcpClient) As String
        Try
            Dim recup_encode(tcpcl.ReceiveBufferSize) As Byte

            flux.Read(recup_encode, 0, CInt(tcpcl.ReceiveBufferSize))
            MsgBox("Lecture de " & Encoding.ASCII.GetString(recup_encode) & " " & tcpcl.ReceiveBufferSize)
            Return Encoding.ASCII.GetString(recup_encode)
        Catch ex As Exception
            MsgBox("Erreur lors de la lecture du flux : " & ex.Message)
        End Try
        Return 0
    End Function

    Private Sub ecriture_flux(ByVal tcpcl As TcpClient, ByVal envoi As String)
        Try
            Dim encode(tcpcl.ReceiveBufferSize) As Byte
            encode = Encoding.ASCII.GetBytes(envoi)

            Dim flux As NetworkStream

            flux = tcpcl.GetStream()
            flux.Write(encode, 0, encode.Length)

        Catch ex As Exception
            MsgBox("Erreur lors de l'écriture sur le flux : " & ex.Message)
        End Try
    End Sub


PS : la réception de données par le serveur depuis les clients marche très bien, c'est seulement la réception des données par les clients depuis le serveur qui ne retourne plus qu'une chaine vide, et ce après la deuxième lecture.
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
12 avril 2010 à 20:58
Bonjour,

Le code que tu fournis ne semble pas incorrecte, mais il n'est que partiel.

Mon site
0
KaNaRette Messages postés 7 Date d'inscription dimanche 4 avril 2010 Statut Membre Dernière intervention 13 avril 2010
12 avril 2010 à 23:56
Disons que je ne sais pas d'où pourrait provenir l'erreur, puisque ça marche à un moment et pas à un autre :s

Au cas où, c'est ici que la récupération déconne (côté client) :
    Private Sub rafraichir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rafraichir.Click
        If nu_j <> j_en_cours Then ' si c'est au joueur de jouer, pas la peine de tout faire planter
            Dim lecture As String
            lecture = lecture_flux()

            log.Items.Add("Données reçues : " & lecture & " màj...")
            ' on met à jour les cases :

            ' 1) la case de destination
            maj_case(Val(lecture(2)), Val(lecture(3)), tab_pieces(Val(lecture(0)), Val(lecture(1))), j_en_cours)

            ' 2) la case de départ
            maj_case_abandonnee(Val(lecture(0)), Val(lecture(1)))

            log.Items.Add("Damier mis à jour. A votre tour")
            nvo_coup()
        End If
    End Sub
Et ici la partie serveur :
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim lecture As String
        If j_en_cours = 1 Then
            lecture = lecture_flux(tcp_j1)
            MsgBox(lecture)
            If lecture <> "0" And lecture <> "" Then ' si la lecture a renvoyé quelque chose, c'est que le joueur a joué
                log.Items.Add("Le joueur 1 a joué : " & lecture)
                j_en_cours = 2 ' changement de joueur en cours
                log.Items.Add("Au joueur 2 de jouer")

                ' envoi des informations au joueur 2
                log.Items.Add("Envoi des informations au joueur 2")
                ecriture_flux(tcp_j2, lecture)
            End If
        Else
            lecture = lecture_flux(tcp_j2)
            MsgBox(lecture)
            If lecture <> "0" And lecture <> "" Then
                log.Items.Add("Le joueur 2 a joué : " & lecture)
                j_en_cours = 1
                log.Items.Add("Au joueur 1 de jouer")

                ' envoi des informations au joueur 1
                log.Items.Add("Envoi des informations au joueur 2")
                ecriture_flux(tcp_j1, lecture)
            End If
        End If
    End Sub
Ce n'est pas un problème de réception par le serveur puisque dans le log il semble capter la bonne information et la retransmet. Je me demande s'il ne s'agit pas d'un problème lors de l'écriture sur le flux, mais je cherche toujours en quoi ça change des premiers coups :s
0
KaNaRette Messages postés 7 Date d'inscription dimanche 4 avril 2010 Statut Membre Dernière intervention 13 avril 2010
13 avril 2010 à 01:53
Bon alors problème réglé.

Pour ceux qui tomberont peut-être un jour sur ce sujet et avec le même problème, en fait c'était juste une histoire d'ordre entre la demande des informations et leur récupération.
Maintenant j'ai tout qui marche, un jeu d'échecs en réseau :D
0
Rejoignez-nous