在客户端断开连接的情况下,如何重用 Networkstream[] ns = new NetworkStream[10]

how can I Reuse Networkstream[] ns = new NetworkStream[10] in the case of a client disconnecting

提问人:Jose Liicks Stuff 提问时间:3/27/2021 最后编辑:Jose Liicks Stuff 更新时间:3/29/2021 访问量:118

问:

我正在使用 Networkstream[] ns = new NetworkStream[10];要保存流,每个客户端一个。 当客户端未返回 keepalive 响应时,服务器将运行以下代码:

                        connectedClientsCount -= 1;
                        connectedClientsStreams[i].Dispose();
                        connectedClientsStreams[i] = new NetworkStream[i]; //Issue here
                        connectedClients[i].Close();
                        connectedClients[i] = new TcpClient(); //no issue
                            arrKeepAlive[i, 0] = 0;
                            arrKeepAlive[i, 1] = 0;

                        

尝试将 connectedClientsStreams[i] 分配给新的 networkstream 实例时,收到以下错误:
无法隐式地将类型“System.Net.Sockets.NetworkStream[]”转换为“System.Net.Sockets.NetworkStream”

其中一个答案建议我使用 IPA 和 Port 等参数初始化一个新的网络流,这在客户端/服务器架构中对我来说没有逻辑意义。因为服务器永远不会手头有这些信息。

进一步的描述应防止进一步的误解。

客户端连接到服务器,服务器将连接的客户端套接字添加到上述数组中,网络流在运行时都在单独的数组中初始化,两个数组的索引都与每个客户端相关,在客户端断开连接时,所述客户端的关联数据将从两个数组中删除,如果不重新初始化或刷新关联的索引,新客户端将无法使用这些索引。

所以我的理解是,我处理/关闭了 2 个数组中引用的现有网络流和套接字,然后重新初始化它们,以便它们为任何未知的未来连接做好准备。

我已经有一种感觉,汤姆想要非个人的 SE 点,而不是为一个被误解/写得不好的问题提供解决方案/答案。我很抱歉无法提出一个符合大家理解的问题。

C# 数组 类型转换 初始化语法 错误

评论


答:

0赞 kshkarin 3/27/2021 #1

如果我理解正确,您想创建一个新的而不是已处置的,那么在您创建带有注释的行中,它应该是以下内容:NetWorkStream//Issue here

connectedClientsCount -= 1;
connectedClientsStreams[i].Dispose();
connectedClientsStreams[i] = new NetworkStream(new Socket(...));  // initalize new object instead of array
connectedClients[i].Close();
connectedClients[i] = new TcpClient(); //no issue
arrKeepAlive[i, 0] = 0;
arrKeepAlive[i, 1] = 0;

问题在于初始化一个新数组而不是对象。NetworkStream

评论

0赞 Jose Liicks Stuff 3/28/2021
嗨,Kshkarin,服务器定期遍历数组并 ping 每个客户端,期望响应以确保连接仍然存在,否则上述代码将运行以从服务器中删除客户端,客户端 tcpclient 对象存在于一个数组中,而 tcpclients 流存在于另一个数组中,我想从相应数组中的索引中删除旧对象并准备要再次使用的索引。因此,在您的示例中,它需要一个新的套接字连接,这可能便于重新连接,但我认为它不适用于为将来的连接准备索引。
0赞 kshkarin 3/28/2021
@JoseLiicksStuff问题是关于分配新的异常并解决异常,这就是答案所提供的。如果您有下一步的新问题,请打开一个新问题,如果这个答案解决了您的原始问题,那么请接受它 stackoverflow.com/help/someone-answersNetworkStream
0赞 Jose Liicks Stuff 3/29/2021 #2

我的查询的解决方案如下:

connectedClientsCount -= 1;
connectedClientsStreams[i].Close(); //since close includes dispose
connectedClientsStreams[i] = null; //removes the closed NS reference
connectedClients[i].Close();
connectedClients[i] = new TcpClient(); //no issue
arrKeepAlive[i, 0] = 0;
arrKeepAlive[i, 1] = 0;

通过在关闭后将 [i] 索引处的值设置为 null,它允许我重用网络流。