Sto iniziando a immergere le dita dei piedi nel mondo della programmazione di rete e recentemente ho trovato un campione abbastanza vecchio da un tutorial di docenti (O almeno così sono detto)."Impossibile leggere i dati dalla connessione di trasporto" - C#
L'abbiamo provato sui computer universitari ma non funzionava, quindi il docente ha assunto che fosse impostato su un ambiente di sicurezza tramite Windows 7 o i sistemi informatici dell'università.
Desideroso di trovare la causa, ho deciso di eseguire lo stesso codice sul mio computer a casa e nessuna sorpresa non ha funzionato.
Esistono due progetti in una soluzione, uno funge da client e da un altro server. Una volta che il server e il client sono entrambi collegati tra loro, il client invia una semplice stringa al server che viene stampata sulla console. Dopodiché vengono chiuse le connessioni appropriate e l'applicazione esce con grazia.
Le applicazioni funzionano per quanto riguarda il server conferma che esso è connesso al cliente ma viene generata un'eccezione (che viene catturato e manipolati) con il testo:
Impossibile leggere i dati dal collegamento : Una connessione esistente è stata forzatamente chiusa dall'host remoto. - (System.IO.IOException)
Ora, mentre io sono solo agli inizi con la programmazione di rete con C# Io non sono esattamente sicuro dove guardare, il mio professore ha detto che avrebbe trovato fuori per conferenza della prossima settimana con la causa e la soluzione al problema, ma ho voluto prendere qualche iniziativa e scoprire me stesso.
Ho aggiunto le classi Client.cs e Server.cs nel caso in cui siano utili, il debugger suggerisce che la causa si trova alla riga 27 in Server.cs, la chiamata a streamReader.Readline();
Nota: Questo non è in alcun modo compito a casa, sono semplicemente curioso di sapere perché non funziona. Chiamatela un'esperienza di apprendimento =]
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()) ;
}
}
}
}
Sarei sorpreso se questo ha funzionato. NetworkStream creato ogni iterazione verrà eliminato dal GC in modo non deterministico, causando la chiusura della connessione sottostante.Comporrò un esempio che dovrebbe funzionare. – dtb
Cura da elaborare? –