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

C#异步Windows项目间数据传输:首次成功后续失效问题求助

解决C#异步Socket通信中第二次发送无响应的问题

我帮你定位到问题根源了!你的服务端在第一次接收完数据后,没有重新启动异步接收流程,导致第二次客户端发送的数据完全没被服务端监听。

问题核心原因

异步Socket的BeginReceive是一次性触发的——它只能监听一次数据接收事件,当完成一次接收后,必须手动再次调用BeginReceive,才能让服务端继续监听后续的新数据。而你的原服务端ReceiveCallback方法,处理完第一次接收后只重置了缓冲区,却没有再次发起异步接收请求。

修复后的服务端代码

修改ReceiveCallback方法,重点在最后重新启动异步接收流程,同时补充异常处理和客户端断开检测:

private void ReceiveCallback(IAsyncResult AR)
{
    try
    {
        int received = _clientSocket.EndReceive(AR);
        if (received == 0)
        {
            // 客户端主动断开连接,执行清理操作
            _clientSocket.Close();
            return;
        }

        Array.Resize(ref _buffer, received);
        string text = Encoding.ASCII.GetString(_buffer);
        // 注意:WPF中后台线程不能直接操作UI,需切换回UI线程
        Dispatcher.Invoke(() => 
        {
            // 这里可以把收到的text显示到界面控件,比如txtReceived.Text = text;
        });

        // 重置缓冲区,准备接收下一次数据
        Array.Resize(ref _buffer, _clientSocket.ReceiveBufferSize);
        // 关键:重新发起异步接收,监听客户端下一次发送的数据
        _clientSocket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);
    }
    catch (Exception ex)
    {
        // 处理异常,比如客户端意外断开的情况
        MessageBox.Show($"接收数据出错:{ex.Message}");
        _clientSocket?.Close();
    }
}

额外优化建议

  1. UI线程安全:异步回调运行在后台线程,WPF中直接操作UI控件会报错,必须用Dispatcher.Invoke切换回UI线程更新界面。
  2. 粘包处理:如果后续发送更长或更复杂的数据,可能出现多个数据包粘在一起的情况,建议在发送的数据包前添加长度前缀或约定分隔符,方便服务端正确拆分数据。
  3. 客户端异常处理:客户端的Click方法中可以补充更多异常场景的处理,比如Socket未连接时的提示。

这样修改后,你点击button1和button2时,服务端就能连续收到"MANGO"和"GRAPES"了。

内容的提问来源于stack exchange,提问作者ambily

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:01:47