You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 20:06:05