Estoy empezando a meterme en el mundo de la programación de redes y recientemente me encontré con una muestra bastante antigua de un tutorial de conferenciantes (o lo que soy dicho)."No se pueden leer los datos de la conexión de transporte" - C#
Lo intentamos en las computadoras de la universidad, pero no funcionó, por lo que el conferenciante asumió que se trataba de una configuración de seguridad ya sea por Windows 7 o por los sistemas informáticos de la universidad.
Ansioso por encontrar la causa, decidí ejecutar el mismo código en mi propia computadora en casa y no fue una sorpresa que no funcionara.
Hay dos proyectos en una solución, uno actúa como el cliente y otro como el servidor. Una vez que el servidor y el cliente están conectados entre sí, el cliente envía una cadena simple al servidor que se imprime en la consola. Después de esto, las conexiones apropiadas se cierran y la aplicación sale con gracia.
Las aplicaciones funcionan por lo que el servidor confirma que se ha conectado con el cliente, sin embargo, se produce una excepción (que se detecta y gestiona) con el texto:
No se puede leer los datos de la conexión de transporte : Una conexión existente fue cerrada a la fuerza por el host remoto. - (System.IO.IOException)
Ahora que estoy empezando con la programación de la red con C# No estoy muy seguro de dónde buscar, mi profesor dijo que iba a descubrir por la conferencia de la próxima semana con la causa y la solución del problema, pero quería tomar una iniciativa y descubrirme a mí mismo.
He agregado las clases Client.cs y Server.cs en caso de que sean útiles, el depurador sugiere que la causa se encuentra en la línea 27 en Server.cs, la llamada a streamReader.Readline();
Nota: Esto no es de ninguna manera la tarea, simplemente tengo curiosidad de por qué no funciona. Diga que es una experiencia de aprendizaje =]
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();
}
}
}
Server.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()) ;
}
}
}
}
Me sorprendería que esto haya funcionado alguna vez. El NetworkStream creado cada iteración será eliminado de forma no determinista por el GC, lo que causará que la conexión subyacente se cierre.Voy a componer un ejemplo que debería funcionar. – dtb
¿Cuidar para elaborar? –