Faire une action lors de la réception d'un message dans un chat
cs_LycanOSX
Messages postés58Date d'inscriptionmardi 21 septembre 2010StatutMembreDernière intervention14 juillet 2013
-
28 déc. 2012 à 22:03
cs_LycanOSX
Messages postés58Date d'inscriptionmardi 21 septembre 2010StatutMembreDernière intervention14 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!
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 :
cs_LycanOSX
Messages postés58Date d'inscriptionmardi 21 septembre 2010StatutMembreDernière intervention14 juillet 20133 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!
Vous n’avez pas trouvé la réponse que vous recherchez ?
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.
cs_LycanOSX
Messages postés58Date d'inscriptionmardi 21 septembre 2010StatutMembreDernière intervention14 juillet 20133 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?
cs_LycanOSX
Messages postés58Date d'inscriptionmardi 21 septembre 2010StatutMembreDernière intervention14 juillet 20133 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!