以下是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);
}
}
}
}
有什么不对吗?
我需要更改什么才能避免此异常?
答案 0 :(得分:1)
致电后
tcpClient.Close();
它清理与之相关的资源,包括处置ns
。
以下一行
int recv = ns.Read(data, 0, data.Length); //getting exception in this line
在您(间接)处理它之后尝试从ns
读取。
在完成连接之前,请勿关闭连接。此外,使用using
关键字而不是显式关闭连接,因为它将确保即使抛出异常也能正确清理。