Я начинаю окунуться в мир сетевого программирования, и недавно я наткнулся на довольно старый пример из учебного пособия для лекторов (или мне так сказали).
Мы попробовали это на университетских компьютерах, но это не сработало, поэтому лектор предположил, что это было связано с настройками безопасности либо в Windows 7, либо в университетских компьютерных системах.
Стремясь найти причину, я решил запустить тот же код дома на своем собственном компьютере, и неудивительно, что он не сработал.
В решении есть два проекта: один выступает в роли клиента, а другой - сервера. Как только сервер и клиент соединены друг с другом, клиент отправляет на сервер простую строку, которая выводится на консоль. После этого соответствующие соединения закрываются, и приложение изящно завершает работу.
Приложения работают до тех пор, пока сервер подтверждает, что он подключился к клиенту, но выдает исключение (которое перехватывается и обрабатывается) с текстом:
Невозможно прочитать данные из транспортного соединения: существующее соединение было принудительно закрыто удаленным хостом. - (System.IO.IOException)
Теперь, когда я только начинаю с сетевого программирования на C #, я не совсем уверен, где искать, мой лектор сказал, что он найдет на следующей неделе лекцию с указанием причины и решения проблемы, но я хотел проявите инициативу и узнайте себя.
Я добавил классы Client.cs и Server.cs на всякий случай, если они полезны, отладчик предлагает причину в строке 27 в Server.cs, вызов streamReader.Readline ();
Примечание : Это ни в коем случае не домашняя работа, мне просто любопытно, почему она не работает. Назовите это опытом обучения =]
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()) ;
}
}
}
}