“Impossible de lire les données de la connexion de transport” - C#
Je commence à tremper mes orteils dans le monde de la programmation réseau et j'ai récemment rencontré un assez vieux échantillon de professeurs tutoriel (Ou alors on m'a dit).
Nous avons essayé de l'université des ordinateurs, mais il ne fonctionne pas si le professeur supposé qu'il était descendu à un paramètre de sécurité par Windows 7 ou par les systèmes informatiques de l'université.
Désireux de trouver la cause, j'ai décidé d'exécuter le même code sur mon propre ordinateur à la maison et pas de surprise il ne fonctionne pas.
Il y a deux projets dans une solution, on joue le rôle du client et de l'autre le serveur. Une fois le serveur et le client sont à la fois reliés les uns aux autres, le client envoie une simple chaîne de caractères au serveur qui est imprimé sur la console. Après cela, les connexions appropriées sont fermés et l'application normalement sorties.
Les applications fonctionnent aussi loin que le serveur confirmant qu'il s'est connecté le client pourtant, il déclenche une exception (Qui est pris et traités) avec le texte:
Impossible de lire les données de la connexion de transport: Une connexion existante a dû être fermée par l'hôte distant. - (Le système.IO.IOException)
Maintenant que je suis débutant en programmation réseau en C# je ne suis pas sûr de savoir exactement où chercher, mon professeur a dit qu'il serait pour la semaine prochaine conférence avec la cause et la solution au problème, mais je voulais prendre un peu d'initiative et de trouver moi-même.
J'ai ajouté le Client.cs et le Serveur.cs classes juste au cas où ils sont utiles, le débogueur suggère la cause se trouve à la ligne 27 du Serveur.cs, l'appel à streamReader.Readline();
Note: Ce n'est pas en aucune façon les devoirs, je suis simplement curieux de savoir pourquoi ça ne fonctionne pas. Appeler une expérience d'apprentissage =]
Client.cs
using System;
using System.Net.Sockets;
using System.IO;
namespace NetworkProgrammingTutorial1Client
{
class Client
{
static void Main(string[] args)
{
TcpClient myclient;
try
{
//Create a TcpClient to talk to the local host.
myclient = new TcpClient("localhost", 1234);
}
catch
{
Console.WriteLine("Failed to connect to the server.");
return;
}
//get a Network stream from the server
NetworkStream networkStream = myclient.GetStream();
StreamWriter streamWriter = new StreamWriter(networkStream);
streamWriter.WriteLine("Have a message.");
streamWriter.Flush();
}
}
}
Serveur.cs
using System;
using System.Net.Sockets;
using System.Net;
using System.IO;
namespace NetworkProgrammingTutorial1Server
{
class Server
{
static void Main(string[] args)
{
//TcpListener is listening on the given port... {
TcpListener tcpListener = new TcpListener(1234);
tcpListener.Start();
Console.WriteLine("Server Started") ;
//Accepts a new connection...
Socket socketForClient = tcpListener.AcceptSocket();
try
{
if (socketForClient.Connected)
{
while (true)
{
Console.WriteLine("Client connected");
NetworkStream networkStream = new NetworkStream(socketForClient);
StreamReader streamReader = new StreamReader(networkStream);
string line = streamReader.ReadLine();
if (line == null)
break;
Console.WriteLine(line);
}
}
socketForClient.Close();
Console.WriteLine("Exiting...");
}
catch(Exception e)
{
Console.WriteLine(e.ToString()) ;
}
}
}
}
Soins à élaborer?
OriginalL'auteur Jamie Keeling | 2010-09-27
Vous devez vous connecter pour publier un commentaire.
Essayer ce code serveur:
Cette écoute sur le port 1234, accepte qu'un seul client, crée un StreamReader et les sorties de toutes les lignes envoyées par le client jusqu'à ce que le client ferme la connexion. Puis il s'arrête à l'écoute et à la sortie.
Comme vous pouvez le voir, un seul StreamReader est créé (pas de manière répétée pour chaque ligne), et à la fois le TcpClient et le StreamReader sont éliminés par le
using
déclaration lorsque vous avez terminé.Votre code client devrait fonctionner. C'est une bonne idée de disposer les objets ici, bien que:
L' .NET Framework fournit deux méthodes de programmation réseau: TcpClient/TcpListener et des prises. TcpClient/TcpListener offre une interface de haut niveau et sont beaucoup plus simple et plus facile à utiliser que le faible niveau des Sockets. C'est donc une bonne idée pour un novice d'utiliser TcpClient/TcpListener et pour éviter les Sockets.
Ezxcellent, merci pour les conseils. Après un changement de Serveur.cs à votre solution le message est envoyé à travers mais après qu'il jette un IOException à la ligne où il tente de lire le message au client.
Je viens de testé mon code et il fonctionne parfaitement sur ma machine. Ce IOException obtenez-vous? La même (la connexion a été fermée par l'hôte distant) ou un autre?
Le texte de l'exception est "Impossible de lire les données de la connexion de transport: Une connexion existante a dû être fermée par l'hôte distant." - Est-ce grave si le projet est construit en mode release?
OriginalL'auteur dtb