在c#

时间:2015-09-27 19:07:23

标签: c# xml-serialization tcpclient networkstream

以下是c#中的示例服务器和客户端代码。服务器将发送一个字符串数组,客户端将接收它并显示,然后客户端将发送一个id,服务器将接收它并显示。但是我在服务器中运行它们时遇到异常。

例外情况如下:

  

System.dll

中发生了未处理的“System.ObjectDisposedException”类型异常      

其他信息:无法访问已处置的对象。

客户端:

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);              
            }               
        }
    }
}

有什么不对吗?

我需要更改什么才能避免此异常?

1 个答案:

答案 0 :(得分:1)

致电后

tcpClient.Close();

它清理与之相关的资源,包括处置ns

以下一行

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

在您(间接)处理它之后尝试从ns读取。

在完成连接之前,请勿关闭连接。此外,使用using关键字而不是显式关闭连接,因为它将确保即使抛出异常也能正确清理。