我啥时候需要处理(服务器-客户端)对象?

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

【讨论】:

感谢您的回答......我发布的代码是草稿......我只是把它放在那里知道连接由于客户端而关闭。以后不需要它它是一个静默服务器..用户不应该通知任何东西。

以上是关于我啥时候需要处理(服务器-客户端)对象?的主要内容,如果未能解决你的问题,请参考以下文章

我啥时候应该嘲笑?

我啥时候需要将异步函数的返回类型声明为未来对象?

我啥时候应该考虑使用内存数据库,需要注意啥问题?

贝宝订阅 API 集成。我啥时候需要创建产品?

jdbc:我啥时候可以关闭啥

我啥时候需要使用存储在数据库中的访问令牌?