2015-09-27 5 views
0

Вот пример кода сервера и клиента в C#. Сервер отправит массив строк, и клиент получит его и отобразит, а затем клиент отправит идентификатор, и сервер получит его и отобразит. Но я получаю исключение на своем сервере во время запуска обоих из них.Отображение строкового массива на клиентской консоли, отправленного с сервера в C#

Исключением является следующим:

Необработанное исключение типа «System.ObjectDisposedException» произошло в System.dll

Дополнительная информация: Не удается получить доступ к объекту, расположенную.

Клиент:

using System; 
using System.Collections.Generic; 
using System.Net; 
using System.Net.Sockets; 
using System.IO; 
using System.Text; 
using System.Xml.Serialization; 

namespace Client 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      try 
      { 
       byte[] data = new byte[1024]; 
       string stringData; 

       TcpClient tcpClient = new TcpClient("127.0.0.1", 1234); 
       NetworkStream ns = tcpClient.GetStream();    

       var serializer = new XmlSerializer(typeof(string[])); 
       var stringArr = (string[])serializer.Deserialize(tcpClient.GetStream()); 

       foreach (string s in stringArr) 
       { 
        Console.WriteLine(s); 
       } 

       string input = Console.ReadLine(); 
       ns.Write(Encoding.ASCII.GetBytes(input), 0, input.Length); 
       ns.Flush(); 
      } 
      catch (Exception e) 
      { 
       Console.Write(e.Message); 
      } 

      Console.Read(); 
     } 
    } 
} 

Сервер:

using System; 
using System.Collections.Generic; 
using System.Net; 
using System.Net.Sockets; 
using System.IO; 
using System.Text; 
using System.Xml.Serialization; 

namespace server 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      TcpListener tcpListener = new TcpListener(IPAddress.Any, 1234); 
      tcpListener.Start(); 

      while (true) 
      {      
       TcpClient tcpClient = tcpListener.AcceptTcpClient(); 
       byte[] data = new byte[1024]; 

       NetworkStream ns = tcpClient.GetStream(); 
       string[] arr1 = new string[] { "one", "two", "three" }; 

       var serializer = new XmlSerializer(typeof(string[])); 
       serializer.Serialize(tcpClient.GetStream(), arr1); 

       tcpClient.Close(); 

       int recv = ns.Read(data, 0, data.Length); //getting exception in this line 

       string id = Encoding.ASCII.GetString(data, 0, recv); 

       Console.WriteLine(id);    
      }    
     } 
    } 
} 

Есть ли что-нибудь не так?

Что мне нужно изменить, чтобы избежать этого исключения?

+2

Я вижу, что это третий раз, когда вы отправляете тот же вопрос с добавленными деталями. Вы можете отредактировать свой вопрос вместо его повторной отправки. Таким образом, предыдущие ответы не будут потеряны. – KOTIX

+1

Почему вы делаете 'tcpClient.Close()', если вы хотите прочитать данные из этого потока позже? Пока не закрывайте соединение. –

+0

Если я не использую это, массив строк не будет отображаться @Maximilian Gerhardt –

ответ

1

После того, как вы звоните

tcpClient.Close(); 

очищает ресурсы, связанные с ним, в том числе утилизации ns.

Следующая строка

int recv = ns.Read(data, 0, data.Length); //getting exception in this line 

попытки чтения из ns после всего (косвенно) утилизировать его.

Не закрывайте соединение, пока оно не будет выполнено. Кроме того, используйте ключевое слово using вместо явного закрытия соединения, так как оно обеспечит правильную очистку, даже если выбрано исключение.

 Смежные вопросы

  • Нет связанных вопросов^_^