如何让C# WebSocket服务实时发送ZK4500指纹设备的Base64数据
解决方案
核心问题分析
你之前的问题出在依赖类变量传递指纹+未在回调内实时触发发送,导致只有首次扫描的指纹被发送,后续更新的指纹没有触发WebSocket的发送逻辑。正确的做法是在SDK的指纹接收回调中,直接使用活跃的WebSocket实例发送最新的Base64指纹数据。
步骤1:全局管理WebSocket实例
将WebSocket实例声明为WinForms窗体的成员变量,确保客户端连接后始终持有有效的活跃实例,避免使用临时变量或未更新的旧实例:
using WebSocketSharp; using System.Drawing; using System.IO; using System.Windows.Forms; public partial class FingerprintForm : Form { // 全局WebSocket实例,确保连接后始终有效 private WebSocket _activeWs; // 初始化WebSocket连接的方法(比如在窗体加载或按钮点击时调用) private void ConnectToReactServer() { // 先关闭旧连接(如果存在) _activeWs?.Close(); _activeWs = new WebSocket("ws://你的React服务器地址"); _activeWs.OnOpen += (sender, e) => { MessageBox.Show("已连接到React服务器"); }; _activeWs.OnClose += (sender, e) => { MessageBox.Show("与服务器断开连接"); // 可选:自动重连逻辑 // Task.Delay(3000).ContinueWith(_ => ConnectToReactServer()); }; _activeWs.Connect(); } }
步骤2:在SDK回调内实时发送指纹
在zkFprint_OnImageReceived回调中,直接处理指纹图像、转Base64,并通过全局WebSocket实例发送。注意处理跨线程问题(SDK回调可能在非UI线程执行):
// 绑定SDK的指纹接收回调(确保在初始化SDK时正确注册此方法) private void zkFprint_OnImageReceived(IntPtr imagePtr, int width, int height) { // 1. 从SDK提供的指针中提取指纹图像 using (Bitmap fingerprintBmp = new Bitmap(width, height, width * 4, PixelFormat.Format32bppArgb, imagePtr)) { // 2. 将Bitmap转为字节数组 byte[] imageBytes; using (MemoryStream ms = new MemoryStream()) { fingerprintBmp.Save(ms, ImageFormat.Png); // 选择PNG格式保证图像质量 imageBytes = ms.ToArray(); } // 3. 转为Base64字符串 string base64Fingerprint = Convert.ToBase64String(imageBytes); // 4. 检查WebSocket状态并发送 if (_activeWs != null && _activeWs.ReadyState == WebSocketState.Open) { // 跨线程处理:WinForms控件操作需在UI线程执行,WebSocket.Send本身线程安全,但保险起见用Invoke if (InvokeRequired) { Invoke(new Action(() => _activeWs.Send(base64Fingerprint))); } else { _activeWs.Send(base64Fingerprint); } } } }
关键注意事项
- 回调注册:确保在初始化ZKT SDK时,将
zkFprint_OnImageReceived方法正确绑定到SDK的事件委托上,否则不会触发回调。 - 资源释放:用
using包裹Bitmap和MemoryStream,避免内存泄漏。 - 重连逻辑:在WebSocket断开时添加自动重连,保证后续扫描的指纹能正常发送。
- 线程安全:WinForms中跨线程操作控件会报错,所以用
Invoke确保WebSocket发送操作在UI线程执行(或确认websocket-sharp的Send方法无需UI线程)。
内容的提问来源于stack exchange,提问作者Bakhtovar Muzaffarov
相关产品推荐
相关产品推荐

