【问题标题】:how can I Reuse Networkstream[] ns = new NetworkStream[10] in the case of a client disconnecting在客户端断开连接的情况下,如何重用 Networkstream[] ns = new NetworkStream[10]
【发布时间】:2021-06-24 01:36:06
【问题描述】:

我正在使用 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] 分配给新的网络流实例时,我收到此错误:
无法将类型“System.Net.Sockets.NetworkStream[]”隐式转换为“System.Net.Sockets.NetworkStream”

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

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

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

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

我已经有一种感觉,Tom 想要客观的 SE 点,而不是为误解/写得不好的问题提供解决方案/答案。很抱歉未能提出一个符合每个人理解的问题。

【问题讨论】:

    标签: c# arrays type-conversion initialization syntax-error


    【解决方案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 的新数组而不是对象。

    【讨论】:

    • 嗨 Kshkarin,服务器会定期循环遍历数组并 ping 每个期望响应的客户端以确保连接仍然存在,否则上述代码运行以从服务器中删除客户端,客户端 tcpclient 对象存在于一个数组,并且 tcpclients 流存在于另一个数组中,我想从各自数组中的索引中删除旧对象并准备要再次使用的索引。所以在你的例子中,它期待一个新的套接字连接,它可能对重新连接很方便,但我不相信它适用于为未来的连接准备索引。
    • @JoseLiicksStuff 问题是关于分配一个新的NetworkStream 并解决异常,这就是答案所提供的。如果您对下一步有新问题,请打开一个新问题,如果此答案解决了您的原始问题,请接受stackoverflow.com/help/someone-answers
    【解决方案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,它允许我重用网络流。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-25
      • 1970-01-01
      • 1970-01-01
      • 2016-02-23
      • 2015-04-15
      • 2013-03-09
      • 2010-11-01
      相关资源
      最近更新 更多