我只是在写一个聊天应用程序(服务器)而且我遇到了问题。
服务器接受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()循环进入下一次迭代时,我都可以在调试器中看到客户端实例被处理掉(我猜想是垃圾收集器)。
因此,当另一个迭代开始时,Connection
列表中的所有Users
个实例都可以,但是它们对TcpClient
的引用仅指回收的实例。因此,连接立即关闭,无法完成任何工作。
你知道问题出在哪里吗?谢谢你的回答。
您可能需要确切的源代码 - 如果是这样,我当然可以提供它。
答案 0 :(得分: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(...)
干杯。