C# SimpleTCP通信客户端发消息报Cannot send data to a null TcpClient错误如何解决
异常原因
- 时序问题:你在
Client_DataReceived事件中使用了txtStatus.Invoke异步调度UI更新逻辑,e.ReplyLine被放到UI线程的执行队列中等待执行。如果在等待执行的间隙,TCP连接已经被服务端断开、或者客户端主动销毁了连接实例,SimpleTCP.Message内部持有的TcpClient引用会被置空,执行e.ReplyLine时就会抛出该异常。 - 连接状态未校验:调用回复方法前没有校验当前TCP连接的存活状态,即使连接已经断开,依然尝试发送数据。
- 版本兼容问题:部分低版本的
SimpleTCP库存在边缘case的bug,当短时间内频繁收发消息时,可能出现内部TcpClient引用提前被释放的问题。
解决方案
- 增加连接状态校验,且把状态校验逻辑放到
Invoke内部,避免异步调度间隙连接状态发生变化,同时添加异常捕获兜底,修改后参考代码如下:
private void Client_DataReceived(object sender, SimpleTCP.Message e) { // 从事件发送者拿到当前的客户端实例 var tcpClient = (SimpleTCP.SimpleTcpClient)sender; txtStatus.Invoke((MethodInvoker)delegate () { txtStatus.Text += e.MessageString; // 回复前先校验连接状态 if (tcpClient.TcpClient != null && tcpClient.TcpClient.Connected) { try { e.ReplyLine(string.Format("Hi: {0}", e.MessageString)); } catch (Exception ex) { // 捕获发送异常,可自行补充断连后的处理逻辑,比如重连、提示用户 txtStatus.Text += $"\r\n回复发送失败:{ex.Message}"; } } }); }
- 如果确认是库版本bug,可以尝试更新
SimpleTCP到最新稳定版,或者自行封装原生TcpClient的发送逻辑替换库自带的ReplyLine方法。
内容的提问来源于stack exchange,提问作者Sabina
相关产品推荐
相关产品推荐

