優化 WebSocket 實現單例連接用于打印【待測試 】

class PrinterWebSocket {
? constructor(url) {
? ? if (PrinterWebSocket.instance) {
? ? ? return PrinterWebSocket.instance;
? ? }
? ??
? ? this.url = url;
? ? this.socket = null;
? ? this.queue = []; // 打印任務隊列
? ? this.isConnecting = false;
? ? this.retryCount = 0;
? ? this.maxRetry = 3;
? ??
? ? PrinterWebSocket.instance = this;
? ? this.connect();
? }

? connect() {
? ? if (this.isConnecting || this.socket) return;
? ??
? ? this.isConnecting = true;
? ? this.socket = new WebSocket(this.url);
? ??
? ? this.socket.onopen = () => {
? ? ? console.log('WebSocket連接已建立');
? ? ? this.isConnecting = false;
? ? ? this.retryCount = 0;
? ? ? this.processQueue();
? ? };
? ??
? ? this.socket.onmessage = (event) => {
? ? ? console.log('收到打印響應:', event.data);
? ? ? // 處理打印響應
? ? };
? ??
? ? this.socket.onclose = () => {
? ? ? console.log('WebSocket連接關閉');
? ? ? this.socket = null;
? ? ? if (this.retryCount < this.maxRetry) {
? ? ? ? this.retryCount++;
? ? ? ? setTimeout(() => this.connect(), 1000 * this.retryCount);
? ? ? }
? ? };
? ??
? ? this.socket.onerror = (error) => {
? ? ? console.error('WebSocket錯誤:', error);
? ? ? this.socket = null;
? ? ? this.isConnecting = false;
? ? };
? }

? print(data) {
? ? if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {
? ? ? console.log('連接未就緒,加入打印隊列');
? ? ? this.queue.push(data);
? ? ? if (!this.isConnecting) {
? ? ? ? this.connect();
? ? ? }
? ? ? return;
? ? }
? ??
? ? try {
? ? ? this.socket.send(JSON.stringify(data));
? ? ? console.log('打印指令已發送');
? ? } catch (error) {
? ? ? console.error('發送打印指令失敗:', error);
? ? ? this.queue.push(data);
? ? ? this.socket = null;
? ? ? this.connect();
? ? }
? }

? processQueue() {
? ? while (this.queue.length > 0 && this.socket?.readyState === WebSocket.OPEN) {
? ? ? const data = this.queue.shift();
? ? ? this.socket.send(JSON.stringify(data));
? ? }
? }

? static getInstance(url) {
? ? if (!PrinterWebSocket.instance) {
? ? ? PrinterWebSocket.instance = new PrinterWebSocket(url);
? ? }
? ? return PrinterWebSocket.instance;
? }
}

使用方法:

// 初始化單例(通常在應用啟動時)
const printer = PrinterWebSocket.getInstance('ws://your-print-server/ws');

// 打印時直接使用
function handlePrint() {
? const printData = {
? ? type: 'print',
? ? content: '要打印的內容',
? ? copies: 1
? };
??
? printer.print(printData);
}

// 頁面按鈕點擊事件
document.getElementById('print-btn').addEventListener('click', handlePrint);

?

優化建議

  1. 心跳機制:添加心跳保持連接活躍

// 在構造函數中添加
this.heartbeatInterval = setInterval(() => {if (this.socket?.readyState === WebSocket.OPEN) {this.socket.send(JSON.stringify({ type: 'heartbeat' }));}
}, 30000);

  1. 連接狀態通知:提供連接狀態變更回調

// 添加狀態監聽
this.onStatusChange = null;// 狀態變更時
const notifyStatus = (status) => {if (this.onStatusChange) {this.onStatusChange(status);}
};// 在onopen/onclose/onerror中調用notifyStatus

  1. 打印結果回調:支持打印結果返回

print(data, callback) {const task = { data, callback };this.queue.push(task);// ...其余邏輯
}// 在onmessage中處理響應時調用callback

這種實現方式避免了每次打印都創建新連接,提高了效率并減少了服務器壓力,同時保證了打印任務的可靠性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/87824.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/87824.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/87824.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring Cloud Alibaba/Spring Boot整合華為云存儲實例(REST API方式)

一個小作業&#xff0c;初次嘗試華為云存儲&#xff0c;一點分享 原項目采用Spring Cloud Alibaba微服務技術、Spring Boot框架技術、VueJS前端框架開發技術&#xff0c;nacos注冊中心&#xff0c;數據庫為mysql 下面看一下沒有運用云存儲的原項目&#xff08;可跳過&#xf…

Petalinux工程如何離線編譯

目錄 一.下載離線包 1.1 共享狀態緩存包&#xff1a;sstate-cache 1.1.1 進入官網打開Petalinux工具網頁 1.1.2 找到相應的Petalinux版本 1.1.3 根據平臺下載 1.2 下載downloads源碼包 1.3 open_components源碼包 二.解壓 2.1 sstate-cache 2.2 downloads源碼包 2.3…

w446數字化農家樂管理平臺的設計與實現

&#x1f64a;作者簡介&#xff1a;多年一線開發工作經驗&#xff0c;原創團隊&#xff0c;分享技術代碼幫助學生學習&#xff0c;獨立完成自己的網站項目。 代碼可以查看文章末尾??聯系方式獲取&#xff0c;記得注明來意哦~&#x1f339;贈送計算機畢業設計600個選題excel文…

AWS WebRTC:通過shell分析viewer端日志文件

在并發過程中,每個viewer會產生一個對應的日志文件,日志文件名為: viewer_channel_index_20250626_030943_145.logviewer端日志比master端日志文件數量多,比例大概是5:1,有1個master就會有5個viewer,每個viewer對應一個日志文件。 我要統計的是從啟動viewer到出第一幀視…

時間轉換——借助時間模塊time

兩種時間戳類型 例如s11704879917000 1、13位的時間戳&#xff1a;單位&#xff08;毫秒&#xff09; &#xff08;1&#xff09;毫秒變成秒&#xff0c;1s1000ms&#xff0c;s1/1000&#xff08;秒&#xff09; &#xff08;2&#xff09;加載時間 times time.localtime(…

LabVIEW MathScript薄板熱流模擬

熱流模擬是熱設計關鍵環節&#xff0c;傳統工具精準但開發周期長&#xff0c;本 VI 利用 LabVIEW 優勢&#xff0c;面向工程師快速驗證需求&#xff0c;在初步方案迭代、教學演示等場景更具效率&#xff0c;為熱分析提供輕量化替代路徑&#xff0c;后續可結合專業工具&#xff…

為什么大語言模型訓練和推理中越來越多地使用 bfloat16?

隨著大語言模型&#xff08;LLM&#xff09;的參數規模從幾十億&#xff08;B&#xff09;飆升到千億&#xff08;T&#xff09;級別&#xff0c;模型的訓練與推理效率變得尤為關鍵。為了在保證精度的同時節省顯存、加快運算&#xff0c;混合精度訓練&#xff08;Mixed Precisi…

暴力破解漏洞與命令執行漏洞

在當今的互聯網世界中&#xff0c;網絡安全威脅無處不在。對于Java后端開發者而言&#xff0c;了解常見的Web漏洞及其防護措施至關重要。本文將探討兩種常見的安全漏洞&#xff1a;暴力破解漏洞&#xff08;Brute Force&#xff09;和命令執行漏洞&#xff08;Command Injectio…

HDFS Java API 開發指南:從基礎操作到高級應用

HDFS (Hadoop Distributed File System) 作為大數據生態的核心存儲系統&#xff0c;提供了分布式、高容錯、高吞吐量的數據存儲能力。通過 Java API 操作 HDFS 是開發大數據應用的基礎技能。本文將基于你的筆記&#xff0c;詳細解析 HDFS Java API 的使用方法&#xff0c;并提供…

區塊鏈技術核心組件及應用架構的全面解析

區塊鏈技術是一套融合密碼學、分布式系統與經濟激勵的復合型技術體系&#xff0c;以下是其核心組件及應用架構的全面解析&#xff1a;一、區塊鏈核心技術棧 1. 分布式賬本技術&#xff08;DLT&#xff09; 核心原理&#xff1a;多節點共同維護不可篡改的數據鏈數據結構&#xf…

golang 協程 如何中斷和恢復

Go語言通知協程退出(取消)的幾種方式 - 知乎 GoLang之goroutine底層系列二(goroutine的創建、讓出、恢復)_golang goroutine-CSDN博客 在 Go 語言中&#xff0c;協程&#xff08;也稱為 goroutine&#xff09;是通過 go 關鍵字啟動的輕量級線程。由于 goroutine 的調度是由 Go…

ARMv8 創建3級頁表示例

最近在研究arm v8頁表創建過程&#xff0c;順帶做了一個如下形式的頁表&#xff0c; // level 1 table, 4 entries: // 0000 0000 - 3FFF FFFF, 1GB block, DDR // 4000 0000 - 7FFF FFFF, 1GB block, DDR // 8000 0000 - BFFF FFFF, 1GB block, DDR // C000 0000 - FFFF FFFF…

遷港戰平 精神可勝國足

遷港戰平可勝國足 江蘇省城市足球聯賽第6輪&#xff0c;宿遷隊主場迎戰連云港隊。比賽中&#xff0c;宿遷隊由張棟和高馳各入一球&#xff0c;連云港隊則憑借穆家鑫與李團杰的進球連扳兩城。最終雙方以2比2握手言和。 第38分鐘&#xff0c;張棟角球進攻中無人盯防推射破門&…

408第三季part2 - 計算機網絡 - ip分布首部格式與分片

理解 好好看一下這個圖 每行是4B&#xff0c;首部也不一定是20B&#xff0c;還有可選字段&#xff0c;可以變的更大 然后我們先看一下概念 然后這個生存時間每路過一個路由器就會扣1滴血 比如一開始是13&#xff0c;經過r1r2r3到B會變成10 但如果是2&#xff0c;經過第二個路…

詳解String類不可變的底層原理

String類 String的基本特性 不可變性: String 對象一旦創建就不能被修改&#xff0c;所有看似修改的操作實際上都是創建新的 String 對象final類: String 類被聲明為 final&#xff0c;不能被繼承基于字符數組: 內部使用final char value[]存儲字符數據(Java9以后改為byte[] …

GIT: 一個用于視覺與語言的生成式圖像到文本轉換 Transformer

摘要 在本文中&#xff0c;我們設計并訓練了一個生成式圖像到文本轉換 Transformer——GIT&#xff0c;以統一視覺-語言任務&#xff0c;如圖像/視頻字幕生成和問答。雖然生成式模型在預訓練和微調之間提供了一致的網絡架構&#xff0c;但現有工作通常包含復雜的結構&#xff…

20250706-9-Docker快速入門(下)-Docker在線答疑_筆記

一、Kubernetes核心概念與集群搭建 1. 在線答疑 &#xfeff; 1&#xff09;答疑Docker需要掌握到什么程度 學習目標&#xff1a;達到入門水平即可&#xff0c;重點掌握第一章Docker入門視頻內容學習建議&#xff1a;預習時間約3-4小時&#xff0c;建議吸收視頻內容的80%學…

Node.js-http模塊

HTTP 協議 概念 HTTP&#xff08;hypertext transport protocol&#xff09;協議&#xff1b;中文叫超文本傳輸協議,是一種基于TCP/IP的應用層通信協議這個協議詳細規定了 瀏覽器 和萬維網 服務器 之間互相通信的規則。協議中主要規定了兩個方面的內容 客戶端&#xff1a;用來…

Java JDBC的初步了解

文章目錄 基本流程注冊驅動的兩種方法DriverManagerDriverManager 的核心作用核心原理自動注冊驅動的機制關鍵方法 示例代碼: 連接Mysql數據庫StatementPreparedStatement JDBC全稱Java DataBase Connectivity。 定義: JDBC 是 Java 語言中用于連接和執行 SQL 操作的標準接口。…

[netty5: ChunkedInput ChunkedWriteHandler]-源碼分析

ChunkedInput ChunkedInput<B> 是 Netty 中用于按塊讀取不定長數據流的接口&#xff0c;常配合 ChunkedWriteHandler 實現流式寫入&#xff0c;支持如文件、流、HTTP 和 WebSocket 等多種數據源。 實現類簡要說明ChunkedFile用于將常規文件按塊傳輸&#xff08;使用傳統…