Développement "mini tchat"

Le
pilouze
Bonjour à tous.
Pour l'école, il me faut développer un tchat (un programme serveur, et
un programme client) en vb.net et en utilisant les sockets.
J'ai donc commencé à développer ces deux programmes, serveur et client,
mais j'ai un souci avec le serveur : je le lance, je dis sur quel port
il doit écouter, je démarre l'écoute, puis après quelques secondes, il
se fige. Mais je n'arrive pas à trouver où se situe le problème !
Ci-dessous le code de mon serveur. Si quelqu'un pouvait m'aider à me
dépatouiller !!! (Il me faudrait un truc qui fonctionne à peu près pour
fin de semaine.)

Merci d'avance !!!


Voici le code du serveur :


Imports System.Net
Imports System.Text
Imports System.Net.Sockets

Public Class Form1
Inherits System.Windows.Forms.Form

#Region " Code généré par le Concepteur Windows Form "

Public Sub New()
MyBase.New()

'Cet appel est requis par le Concepteur Windows Form.
InitializeComponent()

'Ajoutez une initialisation quelconque après l'appel
InitializeComponent()

End Sub

'La méthode substituée Dispose du formulaire pour nettoyer la liste
des composants.
Protected Overloads Overrides Sub Dispose(ByVal disposing As
Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub

'Requis par le Concepteur Windows Form
Private components As System.ComponentModel.IContainer

'REMARQUE : la procédure suivante est requise par le Concepteur
Windows Form
'Elle peut être modifiée en utilisant le Concepteur Windows Form.
'Ne la modifiez pas en utilisant l'éditeur de code.
Friend WithEvents btnConnexion As System.Windows.Forms.Button
Friend WithEvents btnDeconnexion As System.Windows.Forms.Button
Friend WithEvents txtPort As System.Windows.Forms.TextBox
Friend WithEvents Label1 As System.Windows.Forms.Label
Friend WithEvents txtMsg As System.Windows.Forms.TextBox
Friend WithEvents Timer As System.Windows.Forms.Timer
Friend WithEvents StatusBar1 As System.Windows.Forms.StatusBar
<System.Diagnostics.DebuggerStepThrough()> Private Sub
InitializeComponent()
Me.components = New System.ComponentModel.Container
Me.btnConnexion = New System.Windows.Forms.Button
Me.btnDeconnexion = New System.Windows.Forms.Button
Me.txtPort = New System.Windows.Forms.TextBox
Me.Label1 = New System.Windows.Forms.Label
Me.txtMsg = New System.Windows.Forms.TextBox
Me.Timer = New System.Windows.Forms.Timer(Me.components)
Me.StatusBar1 = New System.Windows.Forms.StatusBar
Me.SuspendLayout()
'
'btnConnexion
'
Me.btnConnexion.Location = New System.Drawing.Point(328, 64)
Me.btnConnexion.Name = "btnConnexion"
Me.btnConnexion.Size = New System.Drawing.Size(176, 23)
Me.btnConnexion.TabIndex = 1
Me.btnConnexion.Text = "Démarrer le serveur"
'
'btnDeconnexion
'
Me.btnDeconnexion.Enabled = False
Me.btnDeconnexion.Location = New System.Drawing.Point(328, 104)
Me.btnDeconnexion.Name = "btnDeconnexion"
Me.btnDeconnexion.Size = New System.Drawing.Size(176, 23)
Me.btnDeconnexion.TabIndex = 2
Me.btnDeconnexion.Text = "Arrêter le serveur"
'
'txtPort
'
Me.txtPort.Location = New System.Drawing.Point(112, 64)
Me.txtPort.Name = "txtPort"
Me.txtPort.TabIndex = 0
Me.txtPort.Text = ""
'
'Label1
'
Me.Label1.Location = New System.Drawing.Point(56, 64)
Me.Label1.Name = "Label1"
Me.Label1.Size = New System.Drawing.Size(32, 16)
Me.Label1.TabIndex = 3
Me.Label1.Text = "Port :"
'
'txtMsg
'
Me.txtMsg.Location = New System.Drawing.Point(88, 192)
Me.txtMsg.Multiline = True
Me.txtMsg.Name = "txtMsg"
Me.txtMsg.ScrollBars = System.Windows.Forms.ScrollBars.Vertical
Me.txtMsg.Size = New System.Drawing.Size(424, 288)
Me.txtMsg.TabIndex = 3
Me.txtMsg.Text = ""
'
'Timer
'
Me.Timer.Interval = 1000
'
'StatusBar1
'
Me.StatusBar1.Location = New System.Drawing.Point(0, 504)
Me.StatusBar1.Name = "StatusBar1"
Me.StatusBar1.Size = New System.Drawing.Size(600, 22)
Me.StatusBar1.TabIndex = 5
'
'Form1
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(600, 526)
Me.Controls.Add(Me.StatusBar1)
Me.Controls.Add(Me.txtMsg)
Me.Controls.Add(Me.Label1)
Me.Controls.Add(Me.txtPort)
Me.Controls.Add(Me.btnDeconnexion)
Me.Controls.Add(Me.btnConnexion)
Me.Name = "Form1"
Me.Text = "Serveur"
Me.ResumeLayout(False)

End Sub

#End Region

Dim MaSocketServeur As New Sockets.Socket
(Sockets.AddressFamily.InterNetwork, Sockets.SocketType.Stream,
Net.Sockets.ProtocolType.Tcp)
Dim MaSocketClient As New Sockets.Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp)
Dim IPClient As IPAddress
Dim PortClient As Integer
Dim buff(655360) As Byte
Dim ListeClients As ArrayList = New ArrayList
Dim ListeThreads As ArrayList = New ArrayList

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load

End Sub

Private Sub btnConnexion_Click(ByVal sender As System.Object, ByVal
e As System.EventArgs) Handles btnConnexion.Click
Dim Port As Integer = Int32.Parse(txtPort.Text)
Dim IPAdresse As IPAddress = System.Net.IPAddress.Parse
("127.0.0.1")
Dim IPServeur = New IPEndPoint(IPAdresse, Port)

MaSocketServeur.Bind(IPServeur)
Me.txtMsg.Text &= "Le serveur a été lancé à l'adresse " &
IPAdresse.ToString & " et sur le port " & Me.txtPort.Text & " à " & Hour
(Now) & "h" & Minute(Now) & "m" & Second(Now) & "s." &
Environment.NewLine
Me.btnConnexion.Enabled = False
Me.btnDeconnexion.Enabled = True

ecoute()

Timer.Enabled = True

End Sub

Private Sub ecoute()
Dim t As Threading.Thread

While (1)
Try
MaSocketServeur.Listen(5)

StatusBar1.Text = "Tentative d'écoute"
MaSocketClient = MaSocketServeur.Accept()
ListeClients.Add(MaSocketClient)

IPClient = CType(MaSocketClient.RemoteEndPoint,
IPEndPoint).Address
PortClient = CType(MaSocketClient.RemoteEndPoint,
IPEndPoint).Port
Me.txtMsg.Text &= "Nouveau client connecté : " &
IPClient.ToString & " Port " & PortClient.ToString & Environment.NewLine
StatusBar1.Text = "En écoute"
MaSocketClient.Receive(buff)
'MaSocketClient.Send(buff)
envoi(buff)
Me.txtMsg.Text &= Encoding.ASCII.GetString(buff) &
Environment.NewLine
Catch
StatusBar1.Text = "Erreur écoute"
Exit While
End Try
End While

End Sub

Private Sub envoi(ByVal b() As Byte)
Dim so As Socket

For Each so In ListeClients

If so.Connected Then
Try
so.Send(b)
'so.Send(null, 0, 1, SocketFlags.None)
Catch e As Exception
MessageBox.Show(e.ToString())
End Try

End If

Next so
End Sub
Private Sub btnDeconnexion_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles btnDeconnexion.Click

MaSocketServeur.Close()

Me.txtMsg.Text &= "Le serveur a été arrêté à " & Hour(Now) &
"h" & Minute(Now) & "m" & Second(Now) & "s." & Environment.NewLine
StatusBar1.Text = "Serveur déconnecté"
Me.btnConnexion.Enabled = True
Me.btnDeconnexion.Enabled = False
End Sub

Private Sub Timer_Tick(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Timer.Tick
If MaSocketServeur.Connected Then
Try
MaSocketServeur.Receive(buff)
Catch
End Try
Try
MaSocketServeur.Send(buff)
Catch
End Try
ElseIf MaSocketClient.Connected Then
Try
MaSocketClient.Receive(buff)
Catch
End Try
End If
End Sub

End Class
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Gilles TOURREAU
Le #12232701
Le Tue, 13 Nov 2007 08:51:50 +0100, pilouze
Bonjour à tous.
Pour l'école, il me faut développer un tchat (un programme serveur, et
un programme client) en vb.net et en utilisant les sockets.
J'ai donc commencé à développer ces deux programmes, serveur et client,
mais j'ai un souci avec le serveur : je le lance, je dis sur quel port
il doit écouter, je démarre l'écoute, puis après quelques secondes, il
se fige. Mais je n'arrive pas à trouver où se situe le problème !
Ci-dessous le code de mon serveur. Si quelqu'un pouvait m'aider à me
dépatouiller !!! (Il me faudrait un truc qui fonctionne à peu près pour
fin de semaine....)

Merci d'avance !!!


Voici le code du serveur :


Imports System.Net
Imports System.Text
Imports System.Net.Sockets

Public Class Form1
Inherits System.Windows.Forms.Form

#Region " Code généré par le Concepteur Windows Form "

Public Sub New()
MyBase.New()

'Cet appel est requis par le Concepteur Windows Form.
InitializeComponent()

'Ajoutez une initialisation quelconque après l'appel
InitializeComponent()

End Sub

'La méthode substituée Dispose du formulaire pour nettoyer la liste
des composants.
Protected Overloads Overrides Sub Dispose(ByVal disposing As
Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub

'Requis par le Concepteur Windows Form
Private components As System.ComponentModel.IContainer

'REMARQUE : la procédure suivante est requise par le Concepteur
Windows Form
'Elle peut être modifiée en utilisant le Concepteur Windows Form.
'Ne la modifiez pas en utilisant l'éditeur de code.
Friend WithEvents btnConnexion As System.Windows.Forms.Button
Friend WithEvents btnDeconnexion As System.Windows.Forms.Button
Friend WithEvents txtPort As System.Windows.Forms.TextBox
Friend WithEvents Label1 As System.Windows.Forms.Label
Friend WithEvents txtMsg As System.Windows.Forms.TextBox
Friend WithEvents Timer As System.Windows.Forms.Timer
Friend WithEvents StatusBar1 As System.Windows.Forms.StatusBar
InitializeComponent()
Me.components = New System.ComponentModel.Container
Me.btnConnexion = New System.Windows.Forms.Button
Me.btnDeconnexion = New System.Windows.Forms.Button
Me.txtPort = New System.Windows.Forms.TextBox
Me.Label1 = New System.Windows.Forms.Label
Me.txtMsg = New System.Windows.Forms.TextBox
Me.Timer = New System.Windows.Forms.Timer(Me.components)
Me.StatusBar1 = New System.Windows.Forms.StatusBar
Me.SuspendLayout()
'
'btnConnexion
'
Me.btnConnexion.Location = New System.Drawing.Point(328, 64)
Me.btnConnexion.Name = "btnConnexion"
Me.btnConnexion.Size = New System.Drawing.Size(176, 23)
Me.btnConnexion.TabIndex = 1
Me.btnConnexion.Text = "Démarrer le serveur"
'
'btnDeconnexion
'
Me.btnDeconnexion.Enabled = False
Me.btnDeconnexion.Location = New System.Drawing.Point(328, 104)
Me.btnDeconnexion.Name = "btnDeconnexion"
Me.btnDeconnexion.Size = New System.Drawing.Size(176, 23)
Me.btnDeconnexion.TabIndex = 2
Me.btnDeconnexion.Text = "Arrêter le serveur"
'
'txtPort
'
Me.txtPort.Location = New System.Drawing.Point(112, 64)
Me.txtPort.Name = "txtPort"
Me.txtPort.TabIndex = 0
Me.txtPort.Text = ""
'
'Label1
'
Me.Label1.Location = New System.Drawing.Point(56, 64)
Me.Label1.Name = "Label1"
Me.Label1.Size = New System.Drawing.Size(32, 16)
Me.Label1.TabIndex = 3
Me.Label1.Text = "Port :"
'
'txtMsg
'
Me.txtMsg.Location = New System.Drawing.Point(88, 192)
Me.txtMsg.Multiline = True
Me.txtMsg.Name = "txtMsg"
Me.txtMsg.ScrollBars = System.Windows.Forms.ScrollBars.Vertical
Me.txtMsg.Size = New System.Drawing.Size(424, 288)
Me.txtMsg.TabIndex = 3
Me.txtMsg.Text = ""
'
'Timer
'
Me.Timer.Interval = 1000
'
'StatusBar1
'
Me.StatusBar1.Location = New System.Drawing.Point(0, 504)
Me.StatusBar1.Name = "StatusBar1"
Me.StatusBar1.Size = New System.Drawing.Size(600, 22)
Me.StatusBar1.TabIndex = 5
'
'Form1
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(600, 526)
Me.Controls.Add(Me.StatusBar1)
Me.Controls.Add(Me.txtMsg)
Me.Controls.Add(Me.Label1)
Me.Controls.Add(Me.txtPort)
Me.Controls.Add(Me.btnDeconnexion)
Me.Controls.Add(Me.btnConnexion)
Me.Name = "Form1"
Me.Text = "Serveur"
Me.ResumeLayout(False)

End Sub

#End Region

Dim MaSocketServeur As New Sockets.Socket
(Sockets.AddressFamily.InterNetwork, Sockets.SocketType.Stream,
Net.Sockets.ProtocolType.Tcp)
Dim MaSocketClient As New Sockets.Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp)
Dim IPClient As IPAddress
Dim PortClient As Integer
Dim buff(655360) As Byte
Dim ListeClients As ArrayList = New ArrayList
Dim ListeThreads As ArrayList = New ArrayList

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load

End Sub

Private Sub btnConnexion_Click(ByVal sender As System.Object, ByVal
e As System.EventArgs) Handles btnConnexion.Click
Dim Port As Integer = Int32.Parse(txtPort.Text)
Dim IPAdresse As IPAddress = System.Net.IPAddress.Parse
("127.0.0.1")
Dim IPServeur = New IPEndPoint(IPAdresse, Port)

MaSocketServeur.Bind(IPServeur)
Me.txtMsg.Text &= "Le serveur a été lancé à l'adresse " &
IPAdresse.ToString & " et sur le port " & Me.txtPort.Text & " à " & Hour
(Now) & "h" & Minute(Now) & "m" & Second(Now) & "s." &
Environment.NewLine
Me.btnConnexion.Enabled = False
Me.btnDeconnexion.Enabled = True

ecoute()

Timer.Enabled = True

End Sub

Private Sub ecoute()
Dim t As Threading.Thread

While (1)
Try
MaSocketServeur.Listen(5)

StatusBar1.Text = "Tentative d'écoute"
MaSocketClient = MaSocketServeur.Accept()
ListeClients.Add(MaSocketClient)

IPClient = CType(MaSocketClient.RemoteEndPoint,
IPEndPoint).Address
PortClient = CType(MaSocketClient.RemoteEndPoint,
IPEndPoint).Port
Me.txtMsg.Text &= "Nouveau client connecté : " &
IPClient.ToString & " Port " & PortClient.ToString & Environment.NewLine
StatusBar1.Text = "En écoute"
MaSocketClient.Receive(buff)
'MaSocketClient.Send(buff)
envoi(buff)
Me.txtMsg.Text &= Encoding.ASCII.GetString(buff) &
Environment.NewLine
Catch
StatusBar1.Text = "Erreur écoute"
Exit While
End Try
End While

End Sub

Private Sub envoi(ByVal b() As Byte)
Dim so As Socket

For Each so In ListeClients

If so.Connected Then
Try
so.Send(b)
'so.Send(null, 0, 1, SocketFlags.None)
Catch e As Exception
MessageBox.Show(e.ToString())
End Try

End If

Next so
End Sub
Private Sub btnDeconnexion_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles btnDeconnexion.Click

MaSocketServeur.Close()

Me.txtMsg.Text &= "Le serveur a été arrêté à " & Hour(Now) &
"h" & Minute(Now) & "m" & Second(Now) & "s." & Environment.NewLine
StatusBar1.Text = "Serveur déconnecté"
Me.btnConnexion.Enabled = True
Me.btnDeconnexion.Enabled = False
End Sub

Private Sub Timer_Tick(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Timer.Tick
If MaSocketServeur.Connected Then
Try
MaSocketServeur.Receive(buff)
Catch
End Try
Try
MaSocketServeur.Send(buff)
Catch
End Try
ElseIf MaSocketClient.Connected Then
Try
MaSocketClient.Receive(buff)
Catch
End Try
End If
End Sub

End Class



Pouvez-vous m'envoyer votre projet Client et Serveur sur


Cordialement

--
Gilles TOURREAU


S.A.R.L. P.O.S
Le spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr
Publicité
Poster une réponse
Anonyme