c# - 在客户端断开连接的情况下,如何重用 Networkstream[] ns = new NetworkStream[10]
问题描述
我正在使用 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 个数组中引用的现有网络流和套接字,然后重新初始化它们,以便它们为任何未知的未来连接做好准备。
我已经有一种感觉,汤姆想要客观的 SE 点,而不是为一个被误解/写得不好的问题提供解决方案/答案。我很抱歉不能提出一个符合每个人理解的问题。
解决方案
我的查询的解决方案如下:
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,它允许我重用网络流。
推荐阅读
- python - 如何在 Y 轴上绘制每个索引值
- node.js - 我可以从另一个目录运行 node.js 脚本吗?使用脚本的绝对路径
- python - 考虑一个圆 ( − 40) 2 + ( − 40) 2 = 400。沿 X 轴逆时针旋转 30 度,然后沿 Z 轴平移 +20 个单位
- python-3.x - 使用 win32evtlog.EvtSubscribe 获取多个日志的 Windows 事件日志信息
- python - 尝试将重复的日期列合并为唯一的,以便它与使用 Pandas 的所有列匹配
- css - css:如何获得第一类未设置的第二类值
- checkedlistbox - asp.net 列表框控件未将单个/多个选定值存储到字符串变量/列表中,并且我启用了回发,索引更改也未触发
- python - 字典逻辑的Python列表
- ios - 如何向 iOS 应用程序(cordova-plugin-firebasex)添加推送通知?
- java - Anylogic - 使用字符串值获取对象