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(); } }
额外优化建议
- UI线程安全:异步回调运行在后台线程,WPF中直接操作UI控件会报错,必须用
Dispatcher.Invoke切换回UI线程更新界面。 - 粘包处理:如果后续发送更长或更复杂的数据,可能出现多个数据包粘在一起的情况,建议在发送的数据包前添加长度前缀或约定分隔符,方便服务端正确拆分数据。
- 客户端异常处理:客户端的
Click方法中可以补充更多异常场景的处理,比如Socket未连接时的提示。
这样修改后,你点击button1和button2时,服务端就能连续收到"MANGO"和"GRAPES"了。
内容的提问来源于stack exchange,提问作者ambily
相关产品推荐
相关产品推荐

