Configuration d’un client et d’un serveur TCP / IP pour communiquer sur un réseau

J’essaie d’en apprendre un peu sur la programmation des sockets et je suis tombé sur TcpListener et TcpClient à utiliser au fur et à mesure que je les lisais, ils sont légèrement plus faciles pour les débutants. Le but de base de ce que je veux accomplir est d’avoir un petit formulaire qui puisse être exécuté sur mon ordinateur portable et sur un autre ordinateur portable du même réseau et pouvoir communiquer, c’est-à-dire s’envoyer une chaîne de texte. Une fois que j’aurai ceci, j’espère le développer davantage 🙂

Jusqu’à présent, j’ai créé à la fois un programme client et un programme serveur utilisant msdn et divers guides disponibles sur Internet. Je peux les amener à communiquer quand ils fonctionnent tous les deux sur un ordinateur portable, mais lorsque je déplace le client vers un autre ordinateur portable, je n’obtiens rien. Je pense que mon problème principal est que je ne comprends pas très bien comment le client trouve l’IP des serveurs car je pense que je pourrais le coder en dur mais quand je reviendrai à un autre moment, je suis sûr que l’IP aura changé. Existe-t-il un moyen de faire en sorte que les deux se connectent de manière plus dynamic pour englober l’évolution de l’IP? Mon code client actuel:

public void msg(ssortingng mesg) { lstProgress.Items.Add(">> " + mesg); } private void btnConnect_Click(object sender, EventArgs e) { ssortingng message = "Test"; try { // Create a TcpClient. // Note, for this client to work you need to have a TcpServer // connected to the same address as specified by the server, port // combination. Int32 port = 1333; TcpClient client = new TcpClient(, port); //Unsure of IP to use. // Translate the passed message into ASCII and store it as a Byte array. Byte[] data = System.Text.Encoding.ASCII.GetBytes(message); // Get a client stream for reading and writing. // Stream stream = client.GetStream(); NetworkStream stream = client.GetStream(); // Send the message to the connected TcpServer. stream.Write(data, 0, data.Length); lstProgress.Items.Add(Ssortingng.Format("Sent: {0}", message)); // Receive the TcpServer.response. // Buffer to store the response bytes. data = new Byte[256]; // Ssortingng to store the response ASCII representation. Ssortingng responseData = Ssortingng.Empty; // Read the first batch of the TcpServer response bytes. Int32 bytes = stream.Read(data, 0, data.Length); responseData = System.Text.Encoding.ASCII.GetSsortingng(data, 0, bytes); lstProgress.Items.Add(Ssortingng.Format("Received: {0}", responseData)); // Close everything. stream.Close(); client.Close(); } catch (ArgumentNullException an) { lstProgress.Items.Add(Ssortingng.Format("ArgumentNullException: {0}", an)); } catch (SocketException se) { lstProgress.Items.Add(Ssortingng.Format("SocketException: {0}", se)); } } 

Mon code serveur actuel:

  private void Prog_Load(object sender, EventArgs e) { bw.WorkerSupportsCancellation = true; bw.WorkerReportsProgress = true; bw.DoWork += new DoWorkEventHandler(bw_DoWork); bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged); if (bw.IsBusy != true) { bw.RunWorkerAsync(); } } private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e) { lstProgress.Items.Add(e.UserState); } private void bw_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = sender as BackgroundWorker; if ((worker.CancellationPending == true)) { e.Cancel = true; } else { try { // Set the TcpListener on port 1333. Int32 port = 1333; //IPAddress localAddr = IPAddress.Parse("127.0.0.1"); TcpListener server = new TcpListener(IPAddress.Any, port); // Start listening for client requests. server.Start(); // Buffer for reading data Byte[] bytes = new Byte[256]; Ssortingng data = null; // Enter the listening loop. while (true) { bw.ReportProgress(0, "Waiting for a connection... "); // Perform a blocking call to accept requests. // You could also user server.AcceptSocket() here. TcpClient client = server.AcceptTcpClient(); bw.ReportProgress(0, "Connected!"); data = null; // Get a stream object for reading and writing NetworkStream stream = client.GetStream(); int i; // Loop to receive all the data sent by the client. while ((i = stream.Read(bytes, 0, bytes.Length)) != 0) { // Translate data bytes to a ASCII ssortingng. data = System.Text.Encoding.ASCII.GetSsortingng(bytes, 0, i); bw.ReportProgress(0, Ssortingng.Format("Received: {0}", data)); // Process the data sent by the client. data = Ssortingng.Format("I Have Received Your Message: {0}", data); byte[] mssg = System.Text.Encoding.ASCII.GetBytes(data); // Send back a response. stream.Write(mssg, 0, mssg.Length); bw.ReportProgress(0, Ssortingng.Format("Sent: {0}", data)); } // Shutdown and end connection client.Close(); } } catch (SocketException se) { bw.ReportProgress(0, Ssortingng.Format("SocketException: {0}", se)); } } } 

Comme vous pouvez probablement le constater, je suis nouveau dans ce domaine. S’il y a un meilleur moyen de le mettre en œuvre, je suis ravi d’apprendre! Merci d’avance pour toute aide 🙂

Ma solution grâce aux réponses ci-dessous:

 private Ssortingng IPAddressCheck() { var IPAddr = Dns.GetHostEntry("HostName"); IPAddress ipSsortingng = null; foreach (var IP in IPAddr.AddressList) { if(IPAddress.TryParse(IP.ToSsortingng(), out ipSsortingng) && IP.AddressFamily == AddressFamily.InterNetwork) { break; } } return ipSsortingng.ToSsortingng(); } private void btnConnect_Click(object sender, EventArgs e) { ssortingng message = "Test"; try { Int32 port = 1337; ssortingng IPAddr = IPAddressCheck(); TcpClient client = new TcpClient(IPAddr, port); 

Je ne suis pas sûr que ce soit la solution la plus nette, mais cela fonctionne bien, alors merci pour les réponses 🙂

Vous ne savez pas très bien ce que vous entendez par «moyen plus dynamic d’englober l’évolution de l’IP». Prenons une hypothèse pour commencer si vous avez actuellement:

 TcpClient client = new TcpClient(, port); //Unsure of IP to use. 

Vous pouvez exécuter le client et le serveur sur le même ordinateur et utiliser l’adresse IP de bouclage local:

 IPAddress.Parse("127.0.0.1") 

S’ils fonctionnent sur des machines différentes, remplacez simplement 127.0.0.1 par l’adresse IP utilisée par le serveur (cela suppose l’absence de NAT ou de pare-feu).

Si vous ne souhaitez pas utiliser d’adresses IP, vous pouvez toujours utiliser des noms d’hôte (ceux-ci peuvent être considérés comme plus «dynamics»), mais cela nécessiterait une configuration DNS configurée de manière appropriée (pour les systèmes locaux):

 TcpClient client = new TcpClient("testMachine1", 1333); 

C’est formidable d’apprendre la programmation par socket. Je suis le développeur d’une bibliothèque réseau, networkcomms.net. Si vous souhaitez également travailler en arrière à partir d’un exemple de travail en même temps que l’apprentissage par vous-même, veuillez consulter cet exemple de chat wpf .

Si vous connaissez le nom de l’ordinateur auquel vous souhaitez vous connecter, vous pouvez facilement trouver son adresse IP avec System.Net.DNS.

 var ip = System.Net.Dns.GetHostEntry("JacksLaptop"); ssortingng ipSsortingng = ip.AddressList[0].ToSsortingng(); 

L’IP que vous pensez utiliser n’est peut-être pas celui de l’emplacement 0 de ce tableau, alors faites attention à cela.