Bonjour,
je souhaite programmer un serveur TELNET avec TcpListener, TcpClient, NetworkStream,...
Avec ce programme ci-dessous, un client TELNET se connecte à mon programme, le prg reçoit les commandes
clavier du client, mais le programme passe ensuite (Après 2-3 cmdes) en
non responding.
Je pense qu'avec l'utilisation de TIMER et GetStream cela ne fait pas bon ménage.
Comment éviter cela ?
----------------------------------------------------------------------------------------------
Imports System.Net.Sockets
Imports System.Net
Imports System.Text
Public Class Form1
'********Déclaration de mes variables********
Dim tcpClientConnect As TcpClient
Dim port As Int32 = 23
Dim localAddr As IPAddress = IPAddress.Parse("10.50.11.3")
Dim TcpServer As New TcpListener(localAddr, port)
Dim stream As NetworkStream
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'********Activation du Timer TmrRefresh (Utilisé pour accepter la connexion du client)********
TcpServer = Nothing
TmrRefresh.Enabled = True
TmrData.Enabled = False
On Error GoTo ErroLoad
'********Démarrage du TcpListener********
TcpServer = Nothing
TcpServer = New TcpListener(localAddr, port)
TcpServer.Start()
LblSckStatus.Text = "Server started at 10.50.11.3 / " & port
Exit Sub
ErroLoad:
MsgBox(Err.Number & " - " & Err.Description)
End Sub
Private Sub CmdQuit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdQuit.Click
'********Arrêt du TcpServer + connexion avec client********
tcpClientConnect.Close()
TcpServer.Stop()
TmrRefresh.Enabled = False
TmrData.Enabled = False
End
End Sub
Private Sub TmrRefresh_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TmrRefresh.Tick
'********Désactivation du Timer TmrRefresh (Utilisé pour accepter la connexion du client une seule fois !!)********
'********Activation du Timer TmrData(Utilisé pour lire les données du NetworkStream)********
If TcpServer.Pending <> True Then
tcpClientConnect = TcpServer.AcceptTcpClient
LblSckStatus.Text = "Client accepted "
TmrRefresh.Enabled = False
TmrData.Enabled = True
End If
End Sub
Private Sub TmrData_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TmrData.Tick
'********Lecture du NetworkStream, si donnée dispo...C'est ici que ça bug..


********
Dim i As Integer
Dim bytes(1024) As [Byte]
Dim data As [String] = Nothing
i = 0
stream = tcpClientConnect.GetStream()
If tcpClientConnect.Connected AndAlso stream.CanRead AndAlso stream.CanWrite Then
i = stream.Read(bytes, 0, bytes.Length)
If i <> 0 Then
data = Encoding.ASCII.GetString(bytes, 0, i)
TxtData.Text = TxtData.Text + data & " - " & i
End If
End If
End Sub
End Class
Merci,
Marco