我啥时候需要处理(服务器-客户端)对象?
Posted
技术标签:
【中文标题】我啥时候需要处理(服务器-客户端)对象?【英文标题】:When do i need to dispose a (server-client) objects?我什么时候需要处理(服务器-客户端)对象? 【发布时间】:2012-03-21 04:34:48 【问题描述】:在服务器 -(多)客户端应用程序 [TCP] 中。我为我在服务器中接受的每个客户端使用 Socket、NetworkStream、StreamReader 和 StreamWriter .. 所以我有几个问题:
当我想关闭与客户端的连接时,是否必须将它们全部处理掉? 如果客户端处理与服务器连接的套接字.. 我是否也必须在服务器端处理该套接字,或者它会自动关闭? 在我的代码中: Thread thAccept = new Thread(acceptClient);
Thread thJob;
private void acceptClient()
while (true)
Socket client = server.Accept();
Console.WriteLine(client.RemoteEndPoint+" has connected");
StreamReader reader = new StreamReader(new NetworkStream(client));
//is it ok to create an instance NetworkStream like this or i will have to dispose it later?
thJob = new Thread(Job);
thJob.Start(reader);
private void Job(object o)
StreamReader reader = (Socket)o;
try
string cmd = null;
while ((cmd = reader.ReadLine()) != null)
//(BLA BLA..)
catch
Console.WriteLine("Disconnected by catch");
finally
Console.WriteLine("Finally Done.");
reader.Dispose();
该代码可以处理所有(需要处理的)对象吗?
【问题讨论】:
Proper use of the IDisposable interface的可能重复 请在发布问题之前进行一些搜索。这个问题已经被问了十几次了。 @JohnSaunders 好吧,我还是 c# 的初学者 .. 我无法理解您链接的所有答案.. 但我认为它不能回答我的问题 .. 它有点不同..我部门你读到了最后..你只是读了这个主题!有一些对我很重要的子问题..如果您不想帮助,请..让其他人帮助我,不要关闭我的问题。 好吧,你几乎是对的。我阅读了标题和您问题的文本。我没有阅读代码。这不是重复的。 【参考方案1】:这不是重复的。
您的代码与链接的副本不同,因为在您的代码中,IDisposable
被移交给另一个线程。
一般规则是,如果您创建一个实现IDisposable
的对象,那么您有责任在完成后调用Dispose
。如果可能,应该在 using
块中完成,以确保始终调用 Dispose
。在您的情况下,在退出另一个线程之前,您的代码不会与对象完成。在该线程中,您正确地调用了finally
块中的Dispose
。
如果您在NetworkStream
上调用了Dispose
,那么它也会关闭StreamReader
,这会破坏您的目的。我怀疑如果你在Socket
上调用Dispose
会是同样的事情。因此,您的代码是正确的。
客户端的对象与服务器端的对象没有关系,除了通过TCP/IP。客户端可以在其套接字上调用Dispose
的事实并不意味着服务器必须在其套接字上调用Dispose
。但是,一旦服务器完成从套接字读取数据并关闭连接,服务器端套接字应该是Disposed
。我不确定,但我相信当StreamReader
被释放时,底层的NetworkStream
将被释放,它应该在创建流的套接字上调用Dispose
。
您的代码很好,除了一些不相关的问题:您不需要将cmd
设置为null
,因为您将在下一条语句中设置值。此外,您不应该像这样使用空的 catch
块。你不知道抛出了什么异常,但无论如何你都会忽略它,甚至不会记录或显示异常。至少,你应该这样做
catch (Exception ex)
Console.WriteLine("Disconnected by exception " + ex.ToString());
finally
Console.WriteLine("Finally Done.");
reader.Dispose();
【讨论】:
感谢您的回答......我发布的代码是草稿......我只是把它放在那里知道连接由于客户端而关闭。以后不需要它它是一个静默服务器..用户不应该通知任何东西。以上是关于我啥时候需要处理(服务器-客户端)对象?的主要内容,如果未能解决你的问题,请参考以下文章