如何实现VB Socket客户端持续监听服务端及多客户端消息广播?
VB Socket客户端持续监听服务端推送实现方案
核心实现逻辑
原来的代码仅在按钮点击时执行一次读取操作,要实现持续监听,需要将消息读取逻辑放到独立后台线程中执行,避免阻塞UI线程,同时通过委托实现跨线程UI更新。
具体实现步骤
- 首先在窗体类中定义全局变量与跨线程更新UI的委托
' 全局客户端Socket(需保证连接成功后赋值) Private clientSocket As TcpClient ' 监听后台线程 Private listenThread As Thread ' 跨线程更新消息的委托 Delegate Sub UpdateMsgDelegate(ByVal msgText As String)
- 客户端与服务端连接成功后,启动后台监听线程
你可以在连接按钮的点击事件末尾,或者连接完成的回调中添加以下代码:
' 初始化监听线程 listenThread = New Thread(AddressOf ListenServerPush) ' 设置为后台线程,窗体关闭时自动终止 listenThread.IsBackground = True ' 启动线程 listenThread.Start()
- 编写监听线程执行的消息循环方法
Private Sub ListenServerPush() Try Dim serverStream As NetworkStream = clientSocket.GetStream() Dim inStream(10024) As Byte ' 持续循环监听消息 While clientSocket.Connected ' Read方法为阻塞方法,没有收到消息时会在此处等待 Dim readLength As Integer = serverStream.Read(inStream, 0, inStream.Length) If readLength > 0 Then Dim returndata As String = System.Text.Encoding.ASCII.GetString(inStream, 0, readLength) ' 跨线程调用UI更新方法 Me.Invoke(New UpdateMsgDelegate(AddressOf UpdateMsg), New Object() {"Data from Server : " + returndata}) End If End While Catch ex As Exception ' 连接断开或出现异常时的处理,可自行添加提示 Me.Invoke(New UpdateMsgDelegate(AddressOf UpdateMsg), New Object() {"与服务端断开连接:" + ex.Message}) End Try End Sub ' UI更新方法 Private Sub UpdateMsg(ByVal msgText As String) ' 这里替换为你自己的消息展示逻辑,比如输出到文本框 msg(msgText) End Sub
- 修改原有按钮点击事件,移除读取逻辑,仅保留消息发送逻辑
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click If clientSocket Is Nothing OrElse Not clientSocket.Connected Then MsgBox("未连接到服务端") Exit Sub End If Dim serverStream As NetworkStream = clientSocket.GetStream() Dim outStream As Byte() = System.Text.Encoding.ASCII.GetBytes(TextBox1.Text + "$") serverStream.Write(outStream, 0, outStream.Length) serverStream.Flush() End Sub
注意事项
- 窗体关闭时需要手动释放资源:先关闭clientSocket,再终止监听线程,避免出现资源泄漏
- 你原有代码中使用
$作为消息结束符,建议在收到消息后按$拆分处理,解决TCP粘包问题 - 如果需要支持大文件或长消息传输,建议调整缓冲区大小,或实现分片传输逻辑
内容的提问来源于stack exchange,提问作者Idan Azari
相关产品推荐
相关产品推荐

