websocket封装 案例

思路: 
	封装webscoket 需要考虑的问题
		1、以类的方式封装 调用一个实例
		2、链接
		3、关闭
		4、错误处理
		5、发送消息
		6、链接状态
		7、销毁
		8、日志查看

	根据以上问题定义方法:
		
- create(): 创建一个新的 WebSocket 连接。
- onCloseHandler(event?: CloseEvent): 当 WebSocket 连接关闭时的处理函数。
- onErrorHandler(event?: Event): 当 WebSocket 连接发生错误时的处理函数。
- onOpenHandler(event?: Event): 当 WebSocket 连接成功打开时的处理函数。
- onMessageHandler(event: MessageEvent | WebSocketData): 当 WebSocket 接收到消息时的处理函数。
- constructor(serverInfo: ServerInfo, showLog: boolean = false): 类的构造函数,接收服务器信息和一个可选的日志显示参数。
- isConnected: 一个 getter 方法,用于判断 WebSocket 连接是否处于连接状态。
- destroy(): 销毁 WebSocket 连接。
- sendMessage(data: string): 向 WebSocket 连接发送消息。
- log(...args: any[]): 一个用于显示日志的方法。

import BufferCoder from './codec/buffer'; // 
import decode from './codec/decode'; // 解码用 根据业务封装
import encode from './codec/encode'; // 编码用 根据业务封装

export interface ServerInfo {
    serverType: string;
    host: string;
    port: string | number;
    ssl?: boolean;
}

type WebSocketData = string[] | { [key: string]: string } | undefined;

export default class COMWebSocket {
    private showLog: boolean;
    private serverInfo: ServerInfo;
    private bufferCoder: BufferCoder = new BufferCoder();
    private socket?: WebSocket;
    private create(): void {
        const { host, port, ssl = true } = this.serverInfo;
        const url = `${ssl ? 'wss' : 'ws'}://${host}${port ? `:${port}` : ''}`;

        this.socket = new WebSocket(url);
        this.socket.binaryType = 'arraybuffer';
        this.socket.onclose = this.onCloseHandler.bind(this);
        this.socket.onerror = this.onErrorHandler.bind(this);
        this.socket.onopen = this.onOpenHandler.bind(this);
        this.socket.onmessage = this.onMessageHandler.bind(this);

        this.log(`connecting ${url} ...`);
    }

    private onCloseHandler(event?: CloseEvent): void {
        this.log('onclose', event || 'from worker');

        if (this.onclose) {
            this.onclose.call(this);
        }

        this.destroy();
    }

    private onErrorHandler(event?: Event): void {
        this.log('onerror', event || 'from worker');

        if (this.onerror) {
            this.onerror.call(this);
        }

        this.destroy();
    }

    private onOpenHandler(event?: Event): void {
        this.log('onopen', event || 'from worker');

        if (this.onopen) {
            this.onopen.call(this);
        }
    }

    private onMessageHandler(event: MessageEvent | WebSocketData): void {
        this.bufferCoder.decode((<MessageEvent>event).data, (data) => {
            this.log('onmessage', data);

            if (this.onmessage) {
                this.onmessage.call(this, decode(data));
            }
        });
    }

    onclose?: (this: COMWebSocket, event?: CloseEvent) => any;
    onerror?: (this: COMWebSocket, event?: Event) => any;
    onopen?: (this: COMWebSocket, event?: Event) => any;
    onmessage?: (this: COMWebSocket, event: MessageEvent | WebSocketData) => any;

    constructor(serverInfo: ServerInfo, showLog: boolean = false) {
        this.showLog = showLog;
        this.serverInfo = serverInfo || {};

        this.create();
    }

    get isConnected(): boolean {
        return !!(this.socket && this.socket.readyState === 1);
    }

    destroy(): void {
        if (this.socket) {
            if (this.isConnected) {
                this.socket.close();
            }

            this.socket.onclose = null;
            this.socket.onerror = null;
            this.socket.onopen = null;
            this.socket.onmessage = null;
            delete this.socket;

            this.log('close tcp client!');
        }
    }

    sendMessage(data: string): void {
        const stt: string = encode(data);

        this.log('send', stt);

        if (this.isConnected && stt) {
            (<WebSocket>this.socket).send(this.bufferCoder.encode(stt));
        }
    }

    log(...args: any[]): void {
        if (this.showLog) {
            console.log('[@Shark/net - DYWebSocket]: ', this.serverInfo.serverType, ...args);
        }
    }
}

调用 参考

import COMWebSocket, { ServerInfo } from './webSocket';

// 定义服务器信息
const serverInfo: ServerInfo = {
    serverType: 'Demo Server',
    host: 'example.com',
    port: 8080,
    ssl: true
};

// 创建 COMWebSocket实例
const comWebSocket= new COMWebSocket(serverInfo, true);

// 设置事件处理函数
comWebSocket.onopen = () => {
    console.log('WebSocket 连接已打开');
    comWebSocket.sendMessage('Hello, WebSocket!');
};

comWebSocket.onmessage = (event) => {
    console.log('收到消息:', event);
};

comWebSocket.onclose = () => {
    console.log('WebSocket 连接已关闭');
};

comWebSocket.onerror = (error) => {
    console.log('WebSocket 连接发生错误:', error);
};

// 在需要时,可以销毁 WebSocket 连接
// comWebSocket.destroy();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值