Dans cette leçon, nous allons créer un client qui se connectera au serveur.
Associons le code serveur vu au chapitre précédent (TcpListener) et le client de cette section (TcpClient) pour réaliser pas à pas un outil de discussion TCP.
Distinction des concepts
- Serveur : TcpListener
Il se lie à une IP fixe et un port fixe (9500). Il écoute en arrière‑plan et accepte plusieurs connexions clientes simultanément. C’est comme un commerçant qui attend des clients. - Client : TcpClient
Aucune liaison de port manuelle n’est requise. Le système d’exploitation attribue automatiquement un port temporaire aléatoire pour initier la connexion vers le port serveur 9500.
Les ports des deux extrémités ne sont pas identiques
Port aléatoire du client — port fixe du serveur : 9500
Client en mode console
using System;
using System.Net.Sockets;
namespace TalkClient
{
class Program
{
static void Main(string[] args)
{
// Création de l’objet client TCP
TcpClient tcpClient = new TcpClient();
// Connexion au serveur local 127.0.0.1:9500
// Pour un autre ordinateur, utilisez son IP. Serveur et client ne sont pas obligatoirement sur la même machine.
tcpClient.Connect("127.0.0.1", 9500);
// LocalEndPoint : adresse‑port du client local
// RemoteEndPoint : adresse‑port du serveur distant
Console.WriteLine("Connexion établie, port local {0}, port serveur {1}",
tcpClient.Client.LocalEndPoint,
tcpClient.Client.RemoteEndPoint);
Console.ReadLine();
tcpClient.Close();
}
}
}Langage du code : JavaScript (javascript)
Code client WinForms
Contrôles de l’interface :
textBoxIP: IP du serveurtextBoxPort: port du serveurbuttonStart: bouton « Connexion »textBoxInfo: zone d’affichage des messagestextBoxMsg: champ de saisie des messages à envoyerbuttonSend: bouton d’envoi
using System;
using System.Net.Sockets;
using System.Windows.Forms;
namespace SocketChatClient
{
public partial class Form1 : Form
{
TcpClient tcpClient;
public Form1()
{
InitializeComponent();
}
// Événement clic du bouton connexion
private void buttonStart_Click(object sender, EventArgs e)
{
tcpClient = new TcpClient();
try
{
string ip = textBoxIP.Text;
int port = Convert.ToInt32(textBoxPort.Text);
tcpClient.Connect(ip, port);
textBoxInfo.AppendText($"Connexion réussie ! Point d’extrémité local : {tcpClient.Client.LocalEndPoint}\r\n");
}
catch (Exception ex)
{
MessageBox.Show("Échec de la connexion‑" + ex.Message);
}
}
}
}Langage du code : PHP (php)
Fonctionnement serveur + client
- Lancez d’abord le programme serveur, cliquez sur démarrer, appelez
TcpListener.Start()pour écouter sur le port 9500 - Ensuite lancez le programme client, cliquez sur connexion ;
TcpClient.Connect()réalise la poignée de main à trois voies TCP - Une fois connectés, les deux programmes échangent des messages via
NetworkStream(chapitre suivant)
Remarques importantes
- Causes courantes d’échec de connexion
- Mauvais ordre de lancement : serveur non démarré au préalable
- IP ou port saisis incorrects
- Blocage par le pare‑feu ; évitez
127.0.0.1pour déboguer sur plusieurs ordinateurs, utilisez plutôt l’IP du réseau local
- Points sur les ports
- Le serveur garde le port 9500 fixe et accepte plusieurs clients en même temps
- Le port du client est attribué aléatoirement par le système d’exploitation, il change à chaque exécution, pas besoin de le définir manuellement
- Avertissement sur le blocage
Appeler directement.Connect()dans une application WinForms bloque le thread de l’interface. Dans un projet de production préférez la méthode asynchroneConnectAsyncpour éviter que la fenêtre ne se fige.
Rappel : serveur WinForms (chapitre précédent)
using System;
using System.Net;
using System.Net.Sockets;
using System.Windows.Forms;
namespace SocketChatServer
{
public partial class Form1 : Form
{
IPAddress ip;
TcpListener listener;
public Form1()
{
InitializeComponent();
}
private void buttonStart_Click(object sender, EventArgs e)
{
ip = IPAddress.Parse(textBoxIP.Text);
int port = Convert.ToInt32(textBoxPort.Text);
listener = new TcpListener(ip, port);
listener.Start();
textBoxInfo.Text = $"Serveur démarré {DateTime.Now.ToShortTimeString()}\r\n" + textBoxInfo.Text;
}
}
}Langage du code : C# (cs)
Client
Previous: Écoute de port côté serveur