在客户端显示字符串数组时从套接字中的服务器获取异常

SK33

新成员
已加入
2015年9月26日
留言内容
4
编程经验
Beginner
我已经在c#中创建了一个简单的服务器和客户端程序。服务器将发送一个字符串数组给客户端,客户端将显示它,客户端将发送一个id给服务器,服务器将显示它。我的示例代码如下。当我运行它们时,我在服务器端遇到异常。我已在发生异常的行上标记了我的示例代码如下:

服务器:
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);

            }               
        }
    }
}

客户:


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


我得到的例外是:


System.dll中发生了类型为'System.ObjectDisposedException'的未处理异常
附加信息:无法访问已处置的对象。
[/ XCODE]
 
由主持人最后编辑:

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,028
地点
挪威
编程经验
10+
ObjectDisposedException是因为您首先关闭TcpClient,然后尝试对其进行写入。

您当前的协议将不起作用,xml反序列化器将在返回流之前等待流结束,这仅在关闭NetworkStream时发生,并会阻止您进行进一步的通信。一种选择是序列化为字节数组并将其写入流,在接收方读取字节并反序列化它们。不需要关闭流就可以像这样工作的序列化器是 BinaryFormatter.

请阅读有关如何使用XCODE标签发布代码的常见问题解答: BB代码列表-C#开发人员论坛
 
最佳 底部