基于NetCoreServer类库实现WinForm获取TCP接收字符串的问题
解决方案:通过事件机制传递类库中的TCP接收消息
核心思路是用事件+委托实现类库与UI层的松耦合通信,既不修改NetCoreServer的OnReceived方法签名,又能让窗体类获取到接收的消息,同时兼顾后续控制台客户端的复用需求。
步骤1:在类库的TCP客户端类中定义消息接收事件
在你继承自NetCoreServer.TcpClient的类里,声明一个用于传递接收消息的事件,然后在OnReceived方法中解析出字符串后触发该事件:
using NetCoreServer; using System.Text; public class CustomTcpClient : TcpClient { // 定义接收消息事件,参数为解析后的字符串 public event Action<string> OnMessageReceived; protected override void OnReceived(byte[] buffer, long offset, long size) { // 按实际编码解析字节数组为字符串(示例用UTF-8) string receivedMsg = Encoding.UTF8.GetString(buffer, (int)offset, (int)size); // 触发事件,传递消息(空判断避免空引用) OnMessageReceived?.Invoke(receivedMsg); // 保留NetCoreServer原有逻辑(比如调用基类方法、处理心跳等) base.OnReceived(buffer, offset, size); } // 其他必要的重写方法(如OnConnected、OnDisconnected等)... }
步骤2:在窗体类中订阅事件并更新UI
在WinForm窗体中,实例化类库的TCP客户端对象,订阅其消息接收事件,注意WinForm必须跨线程更新UI,所以要使用Invoke切换到UI线程:
using System.Windows.Forms; public partial class ChatForm : Form { private CustomTcpClient _tcpClient; public ChatForm() { InitializeComponent(); // 初始化TCP客户端 _tcpClient = new CustomTcpClient(); // 订阅消息接收事件 _tcpClient.OnMessageReceived += HandleReceivedMessage; } private void HandleReceivedMessage(string message) { // 判断是否需要跨线程更新UI if (txtChatBox.InvokeRequired) { txtChatBox.Invoke(new Action<string>(HandleReceivedMessage), message); return; } // 直接更新UI控件 txtChatBox.AppendText($"收到消息:{message}{Environment.NewLine}"); } // 其他窗体逻辑(如连接服务器按钮、发送消息按钮等)... }
扩展说明
- 如果需要传递更多信息(比如消息发送方IP、时间戳),可以自定义继承自
EventArgs的类,将事件改为EventHandler<CustomMessageEventArgs>类型。 - 控制台客户端复用类库时,只需订阅同一个事件,在事件处理方法中直接用
Console.WriteLine输出消息即可,无需修改类库代码。
内容的提问来源于stack exchange,提问作者Lunde
相关产品推荐
相关产品推荐

