0

我只是在编写一个聊天应用程序(服务器),但我遇到了问题。

服务器接受连接,TcpClient然后创建Connection类的新实例并将TcpClient' 引用传递给它。这个新Connection实例保存了参考以供将来使用。然后将新Connection实例添加到Users列表中。

让我们看看伪代码:

while(true)
{
    // 1. Accept connection into new Client instance
    Client = new TcpClient()
    Client = AcceptTcpClient();
    // 2. Create new Connection object and pass Client's reference to it.
    Connection abc = new Connection(Client);

    // Add new user to users collection
    Users.Add(Connection);
}

现在该abc实例引用了 Client 对象。直到这里一切正常,但每次 while() 循环进入下一次迭代时,我都可以在调试器中看到 Client 实例已被处理(我想是由垃圾收集器处理的)。

因此,当另一个迭代开始时,列表中的所有Connection实例Users都可以,但它们对引用的TcpClient引用只是回收的实例。因此连接立即关闭,无法进行任何工作。

你知道问题出在哪里吗?感谢您的回答。

您可能需要确切的源代码 - 如果需要,我当然可以提供。

4

1 回答 1

1

它不是一个单一的连接。

这里有两件事重叠。

“连接”取决于要创建的客户端,并且您正在创建多个客户端和多个各自的连接。

您可以通过使用空引用来欺骗垃圾收集器,并在循环外声明变量:

public void Dummy(ref Connection AConnection, ref TcpClient AClient)
{
  AConnection = null;
  AClient = null;
} // void Dummy(...)

public void Example()
{
  TcpClient Client = null;
  Connection abc = null;

  while(true)
  {
      // 1. create new Client instance, WITHOUT connection
      Client = new TcpClient()
      //Client = AcceptTcpClient();

      // 2. Create new Connection object that requires Client's reference to it.
      Connection abc = new Connection(Client);

      // Add new user to users collection
      Users.Add(abc);

      // uncomment only when debugging
      Dummy(ref abc, ref Client)
  } // while

  // uncomment only when debugging
  Client = null;
  abc = null;
} // void Example(...)

干杯。

于 2012-06-07T18:59:57.937 回答