Faire une action lors de la réception d'un message dans un chat

cs_LycanOSX Messages postés 58 Date d'inscription mardi 21 septembre 2010 Statut Membre Dernière intervention 14 juillet 2013 - 28 déc. 2012 à 22:03
cs_LycanOSX Messages postés 58 Date d'inscription mardi 21 septembre 2010 Statut Membre Dernière intervention 14 juillet 2013 - 1 janv. 2013 à 17:04
Bonjour tout le monde, je travaille actuellement su un petit chat et je voudrait qu'une événement ce produise quand on reçoit un message, et je n'y arrive pas trop, voilà les codes:

Le serveur:
Imports System.Net.Sockets
Imports System.IO
Imports System.Net

Module Module1
    Private server As TcpListener
    Private client As New TcpClient
    Private ipendpoint As IPEndPoint = New IPEndPoint(IPAddress.Any, 8888)
    Private list As New List(Of Connection)

    Private Structure Connection
        Dim stream As NetworkStream
        Dim streamw As StreamWriter
        Dim streamr As StreamReader
        Dim nick As String
        Dim group As String
    End Structure

    Sub Main()
        Console.WriteLine("Server launched!")
        server = New TcpListener(ipendpoint)
        server.Start()

        While True
            client = server.AcceptTcpClient

            Dim c As New Connection
            c.stream = client.GetStream
            c.streamr = New StreamReader(c.stream)
            c.streamw = New StreamWriter(c.stream)

            c.nick = c.streamr.ReadLine
            c.group = c.streamr.ReadLine

            list.Add(c)
            Console.WriteLine(c.group & " " & c.nick & " is now connected.")

            Dim t As New Threading.Thread(AddressOf ListenToConnection)
            t.Start(c)
        End While
    End Sub

    Private Sub ListenToConnection(ByVal con As Connection)
        Do
            Try
                Dim tmp As String = con.streamr.ReadLine
                Console.WriteLine(con.group & " " & con.nick & ": " & tmp)
                For Each c As Connection In list
                    c.streamw.WriteLine(con.group & " " & con.nick & ": " & tmp)
                    c.streamw.Flush()
                Next
            Catch
                list.Remove(con)
                Console.WriteLine(con.group & " " & con.nick & " is now disconnected.")
                Exit Do
            End Try
        Loop
    End Sub
End Module


Le client:
Imports System.Net.Sockets
Imports System.IO

Public Class Form1
    Private stream As NetworkStream
    Private streamw As StreamWriter
    Private streamr As StreamReader
    Private client As New TcpClient
    Private t As New Threading.Thread(AddressOf Listen)
    Private Delegate Sub DAddItem(ByVal s As String)
    Private nick As String = "unknown"
    Private RequestIP As String
    Private group As String

    Private Sub AddItem(ByVal s As String)
        RichTextBox1.Text = RichTextBox1.Text & s & vbCrLf
    End Sub


    Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown

        Try
            client.Connect(RequestIP, 8888)
            If client.Connected Then
                stream = client.GetStream
                streamw = New StreamWriter(stream)
                streamr = New StreamReader(stream)

                streamw.WriteLine(nick)
                streamw.WriteLine(group)
                streamw.Flush()

                t.Start()

            Else
                MessageBox.Show("The server isn't launched!")
                Application.Exit()
            End If
        Catch ex As Exception
            MessageBox.Show("Error: " & ex.Message)
            Application.Exit()
        End Try
    End Sub

    Private Sub Listen()
        While client.Connected
            Try
                Me.Invoke(New DAddItem(AddressOf AddItem), streamr.ReadLine)
            Catch ex As Exception
                MessageBox.Show("Error: " & ex.Message)
                Application.Exit()
            End Try
        End While
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        streamw.WriteLine(TextBox1.Text)
        streamw.Flush()
        TextBox1.Clear()
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        RequestIP = InputBox("Choose the server IP:", "IP", "")
        nick = InputBox("Choose a nickname for this server:", "Nickname", "")
        If RequestIP "127.0.0.1" Or RequestIP "localhost" Then
            group = "[Admin]"
        Else
            group = "[User]"
        End If
    End Sub


End Class


J'ai bien-sur essayé et recherché comment faire avant de venir sur le forum. Es que quelqu'un pourrait il m'aider s'il vous plait? Merci beaucoup!

8 réponses

Utilisateur anonyme
28 déc. 2012 à 23:00
Bonsoir,

Quel type d'événement ?
Côté serveur ou côté client ?
0
cs_LycanOSX Messages postés 58 Date d'inscription mardi 21 septembre 2010 Statut Membre Dernière intervention 14 juillet 2013 3
29 déc. 2012 à 12:46
Coté client surtout, par exemple: Émettre un sons lors de la réception d'une message, ce genre de choses. Merci!
0
Utilisateur anonyme
29 déc. 2012 à 23:51
A toi d'inventer ton protocole du style IRC avec des commandes précédant les messages à afficher. Par exemple, si une connexion survient, le serveur peut envoyer ceci :

NEW_CONNEXION:pseudo


Lorsque ton client lira le message serveur, il lira la commande NEW_CONNEXION et saura qu'il doit faire jouer un son particulier. Ensuite tu pourras afficher un message du style :
pseudo vient d'arriver.
0
cs_LycanOSX Messages postés 58 Date d'inscription mardi 21 septembre 2010 Statut Membre Dernière intervention 14 juillet 2013 3
31 déc. 2012 à 00:55
Etant le premier programme avec ce genre de protocole, je ne comprend pas trop le fonctionnement de NEW_CONNEXION:pseudo, pourrais tu m’expliquer rapidement s'il te plait! Merci pour ton aide!
0

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

Posez votre question
Utilisateur anonyme
31 déc. 2012 à 12:41
Il s'agissait juste d'un exemple.
1 / le serveur envoie : NEW_CONNEXION:pseudo
2 / le client isole (par un split sur la chaîne) les deux parties soit NEW_CONNEXION d'une part et pseudo de l'autre. Puis il agit en conséquence en fonction de la première partie (son ou autre) et affiche un message en se servant des données contenues dans la deuxième partie.
0
cs_LycanOSX Messages postés 58 Date d'inscription mardi 21 septembre 2010 Statut Membre Dernière intervention 14 juillet 2013 3
31 déc. 2012 à 13:57
Ok! Merci beaucoup je vais essayer de faire ça merci!
0
cs_LycanOSX Messages postés 58 Date d'inscription mardi 21 septembre 2010 Statut Membre Dernière intervention 14 juillet 2013 3
31 déc. 2012 à 15:55
J'ai fait un système a peut près comme tu me la conseillé, ça donne ce code:

Le client envois le message:
Private Sub sendChatFormatMsg(ByVal txt As String)
        sendMsg("NEW_MESSAGE::" & txt)
    End Sub


Ensuite, mon serveur reçois le message, retourne ce qu'il doit au client:
Private Sub ListenToConnection(ByVal con As Connection)
        Do
            Try
                Dim tmp As String = con.streamr.ReadLine
                Dim split() As String = tmp.Split("::")

                Console.WriteLine(tmp)
                For Each c As Connection In list
                    If split(0) = "NEW_MESSAGE" Then
                        c.streamw.WriteLine("NEW_MESSAGE::" & Format(Now, "hh:mm:ss") & " | " & c.nick & ">> " & tmp.Replace("NEW_MESSAGE::", ""))
                    End If
                    c.streamw.Flush()
                Next
            Catch
                list.Remove(con)
                Console.WriteLine(con.nick & " is now disconnected.")
                Exit Do
            End Try
        Loop
    End Sub


Puis mon client interprète le message:
    Private Sub Listen()
        While client.Connected
            Try
                If streamr.ReadLine.Split("::")(0) = "NEW_MESSAGE" Then
                    Me.Invoke(New DAddItem(AddressOf AddItem), streamr.ReadLine.Replace("NEW_MESSAGE::", ""))
                End If
            Catch ex As Exception
                MessageBox.Show("Error: " & ex.Message)
                Application.Exit()
            End Try
        End While
    End Sub


Mais j'ai un gros bug, le client n'affiche pas tout le temps le message. Quelqu'un aurait un idée s'il vous plait?
0
cs_LycanOSX Messages postés 58 Date d'inscription mardi 21 septembre 2010 Statut Membre Dernière intervention 14 juillet 2013 3
1 janv. 2013 à 17:04
Et j'ai réussi à avoir ce rapport d'erreur: Impossible d'appeler Invoke ou BeginInvoke sur un contrôle tant que le handle de fenêtre n'a pas était créé. Quelqu'un à t'il une idée s'il vous plait? Merci!
0
Rejoignez-nous