“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()) ;
            }
        }
    }
}
Je serais surpris s'il a jamais travaillé. Le NetworkStream créé à chaque itération non-déterministe être éliminés par le GC, qui sera la cause de la connexion sous-jacente à être fermé. Je vais composer un exemple qui devrait fonctionner.
Soins à élaborer?

OriginalL'auteur Jamie Keeling | 2010-09-27